网站首页 文章专栏 PHP 数组和对象的差异 与使用抉择
个人观点:
因为php支持范式类型,数组和对象可以相互转化,使得我们数组和对象两个使用的感知区别不大,而数组的定义与匿名对象的定义又过于相似,不细细归类整理下,就真是井底之蛙了。
1.数组 和对象的使用场景是不同的:
数组更加偏向于灵活的组建,修改,来变成自己想要的结果,毕竟PHP内置了那么多的数组函数,给人一种数组就是核心的感觉;而 对象更偏向于框架的构建、ORM层封装,统一、封闭的实现特定的功能,可以任由我们扩展方法与属性。
简单的说,如果你只是个人业务进行一个数据转换,直接用PHP内置函数,简单方便;但如果你想写一个方法,来实现不同的依据不同的场景转换,变换不同的数据结构,那果断采用对象。
2.数组和对象的数据传递方式不同
数组的传递是一个值传递,对象的传递是引用传递。简单的说,大部分的php数组内置函数处理(没有返回值的),或者在我们没有使用 & 传引用时操作数组,并不会改变当前的数组,因为php的底层机制是,复制一个新的数组进行处理(变成了两个数组,所以比较占内存)。而对象整体的操作都是 引用传递,时刻在改变原数据,函数中改变了对象的属性,那原本的对象也被改变了
3.数组与对象对内存的消耗,差异有点大 (实体对象 <数组 < 匿名对象)
eg:
class obj { public $name; public $id; public function __construct($id,$name) { $this->name = $name; $this->id = $id; } } $max = 10000; $old = memory_get_usage(); echo "初始内存消耗:".formatBytes($old)."<br/>"; for ($i=0;$i<$max;$i++){ $arrayList[] = [$i,$max]; } $new = memory_get_usage(); echo "{$max}个数组(枚举数组)内存消耗:".formatBytes($new-$old)."<br/>"; echo "{$max}个数组(枚举数组)内存消耗:".formatBytes($new-$old)."<br/>"; $old = memory_get_usage(); for ($i=0;$i<$max;$i++){ $arrayList[] = ["id"=>$i,"name"=>$max]; } $new = memory_get_usage(); echo "{$max}个数组(和对象可以互相转换的关联数组)内存消耗:".formatBytes($new-$old)."<br/>"; $old = memory_get_usage(); for ($i=0;$i<$max;$i++){ //外部定义,重复赋值 (操作的还是一个对象) $objectList[] = new obj($i,$max); } $new = memory_get_usage(); echo "{$max}个对象(实体对象)内存消耗:".formatBytes($new-$old)."<br/>"; $old = memory_get_usage(); for ($i=0;$i<$max;$i++){ //内部不断定义新的 等于每次都新建定义了1个对象 $object= new stdClass(); $object->id=$i; $object->name=$max; $objectList[] = $object; } $new = memory_get_usage(); echo "{$max}个对象(匿名对象)内存消耗:".formatBytes($new-$old)."<br/>"; function formatBytes($size) { $units = array(' B', ' KB', ' MB', ' GB', ' TB'); for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024; return round($size, 2).$units[$i]; }
输出结果为:
初始内存消耗:416.81 KB 10000个数组(枚举数组)内存消耗:4.09 MB 10000个数组(枚举数组)内存消耗:4.09 MB 10000个数组(和对象可以互相转换的关联数组)内存消耗:4.09 MB 10000个对象(实体对象)内存消耗:1.38 MB 10000个对象(匿名对象)内存消耗:4.59 MB
转载请注明出处