
本文讲解如何设计一个 php 类方法,使其能统一接收字符串或数组参数,并将所有值累积到类的同一个数组属性中,避免每次调用都生成独立数组。核心在于类型归一化与展开合并。
要实现用户数据的持续累积(而非每次调用 add() 都新建一个局部数组),关键在于:将输入统一转为数组,并追加到类的持久化属性中,而非局部变量。
原始代码的问题在于:
- $arr = array(); 在每次 add() 调用时都会重新声明,属于局部变量,作用域仅限于该方法;
- print_r($arr) 仅输出当前批次的数据,未保存也未合并到类状态中;
- 缺乏对历史数据的引用和累加逻辑。
✅ 正确做法是:
- 声明一个类属性(如 public $listOfUsers = [];)作为长期存储容器;
- 将任意输入(字符串或数组)强制转换为数组 —— (array)$stringOrArray 是安全且简洁的方式(字符串变为 [value],原生数组保持不变);
- 使用 array_push($this->listOfUsers, ...$convertedArray) 结合 展开运算符 ... 实现批量追加(PHP 5.6+ 支持)。
以下是优化后的完整类实现:
class Users
{
public $listOfUsers = [];
public function add($stringOrArray): void
{
array_push($this->listOfUsers, ...(array)$stringOrArray);
}
}? 使用示例:
$users = new Users();
$users->add('Terrell Irving');
$users->add('Magdalen Sara Tanner');
$users->add('Chad Niles');
$users->add(['Mervin Spearing', 'Dean Willoughby', 'David Prescott']);
var_export($users->listOfUsers);✅ 输出结果(单个扁平化数组):
array ( 0 => 'Terrell Irving', 1 => 'Magdalen Sara Tanner', 2 => 'Chad Niles', 3 => 'Mervin Spearing', 4 => 'Dean Willoughby', 5 => 'David Prescott', )
⚠️ 注意事项:
- ...(array)$input 是健壮的类型适配方案,比手动 if/else 判断更简洁、不易遗漏边界情况(如 null、false 等会被转为空数组,可根据业务需要补充校验);
- 若需去重,可在 add() 内部或最终获取时调用 array_unique($this->listOfUsers);
- 如需支持链式调用,可将 return $this; 加入 add() 方法末尾;
- 属性建议设为 protected 并配合 getter 方法(如 getUsers())以增强封装性,生产环境推荐如此。
通过这一设计,你获得了一个真正“累积式”的数据收集器 —— 每次调用都在向同一数组追加内容,彻底解决“多个孤立数组”的问题。










