网站首页 文章专栏 PHP 数组和对象的差异 与使用抉择

PHP 数组和对象的差异 与使用抉择

编辑时间:2020-06-01 14:09:39 作者:苹果 浏览量:1853


    前言:项目中,经常用到对象和实体两个概念,经常转来转去,这两个到底用什么区别?如何选择?


个人观点:

    因为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



    出自:何冰华个人网站

    地址:https://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论