在PHP开发中,对象数组是非常常用的数据结构,既可以存储多个同类型的对象实例,也能灵活承载不同类的对象,合理创建和管理对象数组能提升代码的可维护性和运行效率。

什么是PHP对象数组
PHP的对象数组指的是数组的元素为对象实例的数组结构,和普通索引数组、关联数组的区别在于存储的值类型不同。比如我们可以创建一个存储多个用户对象的数组,每个元素对应一个独立的用户实例,方便批量处理用户相关的数据。
创建对象数组的常用方法
1. 直接实例化赋值创建
这种方式适合对象数量较少的场景,直接创建对象后赋值给数组的对应索引即可。
<?php
// 定义一个简单的用户类
class User {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
// 直接创建对象数组
$userArr = [];
$userArr[0] = new User('张三', 20);
$userArr[1] = new User('李四', 22);
$userArr[2] = new User('王五', 25);
// 打印数组查看结构
print_r($userArr);
?>2. 循环批量创建对象数组
当需要创建大量同类型对象时,使用循环批量创建会更高效,避免重复编写实例化代码。
<?php
class Product {
public $id;
public $price;
public function __construct($id, $price) {
$this->id = $id;
$this->price = $price;
}
}
$productArr = [];
// 循环创建10个产品对象存入数组
for ($i = 1; $i <= 10; $i++) {
$productArr[] = new Product($i, $i * 10);
}
echo '产品数组长度:' . count($productArr);
?>3. 关联键名创建对象数组
如果需要通过特定标识快速访问对象,可以使用关联数组的形式创建对象数组,键名可以是字符串或者数字。
<?php
class Order {
public $orderNo;
public $amount;
public function __construct($orderNo, $amount) {
$this->orderNo = $orderNo;
$this->amount = $amount;
}
}
$orderArr = [];
$orderArr['ORD001'] = new Order('ORD001', 199);
$orderArr['ORD002'] = new Order('ORD002', 299);
$orderArr['ORD003'] = new Order('ORD003', 399);
// 通过键名直接访问
echo $orderArr['ORD002']->amount;
?>对象数组的管理操作
1. 新增元素
对象数组新增元素和普通数组操作一致,可以用方括号赋值或者array_push函数。
<?php
$userArr = [];
$userArr[] = new User('赵六', 28);
// 使用array_push新增
array_push($userArr, new User('孙七', 30));
?>2. 修改元素
可以直接通过索引或者键名访问到对象,修改对象的属性值即可完成修改。
<?php $userArr[0]->age = 21; $orderArr['ORD001']->amount = 219; ?>
3. 删除元素
可以使用unset函数删除指定索引的元素,删除后数组索引不会自动重置,如果需要重置可以用array_values。
<?php unset($userArr[1]); // 重置索引 $userArr = array_values($userArr); ?>
4. 遍历对象数组
常用的遍历方式有foreach循环,也可以结合for循环使用,根据场景选择即可。
<?php
// foreach遍历
foreach ($userArr as $user) {
echo '姓名:' . $user->name . ',年龄:' . $user->age . '<br>';
}
// for循环遍历
$len = count($productArr);
for ($i = 0; $i < $len; $i++) {
echo '产品ID:' . $productArr[$i]->id . ',价格:' . $productArr[$i]->price . '<br>';
}
?>5. 对象数组排序
可以使用usort函数自定义排序规则,根据对象的某个属性进行排序。
<?php
// 按用户年龄升序排序
usort($userArr, function($a, $b) {
return $a->age <=> $b->age;
});
print_r($userArr);
?>使用对象数组的注意事项
- PHP中对象赋值是引用传递,把对象存入数组后,修改数组外的原对象或者数组内的对象,都会互相影响,如果需要独立副本可以用
clone关键字。 - 对象数组占用内存会比普通数组高,因为存储的是对象实例,如果对象数量过多需要注意内存占用问题。
- 遍历对象数组时如果需要修改元素,建议用引用遍历
foreach ($arr as &$item),避免修改不生效的问题。 - 访问对象属性前最好先判断对象是否存在,避免出现未定义属性的错误,可以用
isset或者property_exists函数检查。
注意:如果对象数组中的元素是不同类的实例,调用属性或方法前需要先判断对象类型,避免调用不存在的方法导致错误。