【问题标题】:Using arrays VS objects for storing data [duplicate]使用数组VS对象来存储数据[重复]
【发布时间】:2011-04-12 04:40:56
【问题描述】:

可能重复:
When should I use stdClass and when should I use an array in php5 oo code ??

使用这两种结构中的一种比另一种有什么好处?

// array
$user['name'] = 'Emanuil';

// object
$user->name = 'Emanuil';

【问题讨论】:

  • 为什么说1比2好?我个人不同意这种说法。你能解释一下为什么你认为 1 比 2 更好吗?我们是在谈论效率、内存消耗、编码实践吗?看看:particletree.com/notebook/object-oriented-php-memory-concerns也。
  • 提示:也许数组消耗的资源更少。
  • @Chris:我想我在某处读到过,如果您需要一个结构来存储数据,那么 1 是首选方式。
  • @fabrik:你是对的。我不应该要求“更好”。我编辑了这个问题来解决这个问题。

标签: php


【解决方案1】:

数组

  • array_*函数可以处理数组,其中大部分都非常快。
  • 默认情况下,它们按值传递(复制)
  • 轻量级/简单(仅更改影响局部变量,无需考虑)
  • 通常用于构建一次数据(不会更改的数据)
  • 所有数据都是公开的
  • 稍微占用资源较少

对象

  • 可以使用方法来保持数据更严格。 (即检查字段是否符合格式)
  • 子类化(减少代码重复)
  • 默认情况下,它们通过引用传递
  • 对数据的更改可能会产生级联效应(__get__set 等)
  • 通常用于更易变的数据
  • 可以通过函数和受保护/私有变量保护数据免受外部影响
  • 对象的函数类型提示更加灵活(不同类的类型提示不同)

【讨论】:

    【解决方案2】:

    只需运行一个简单的测试:

    $ts_o = microtime(true);
    for($i=0;$i<=1000;$i++)
    {
        new stdClass();
    }
    $total_object = microtime(true) - $ts_o;
    

    对比:

    $ts_a = microtime(true);
    for($i=0;$i<=1000;$i++)
    {
        array();
    }
    $total_array = microtime(true) - $ts_a;
    

    并计算他的结果。

    echo 'Object: ' . $total_object . ' / Array: ' . $total_array;
    

    结果:对象:0.002635 / 数组:0.001243

    如您所见,阵列的速度更快,实际上平均为 46.6%。

    但是当你开始添加变量时,它们突然转身:

    $ts_o = microtime(true);
    for($i=0;$i<=1000;$i++)
    {
        $var = new stdClass();
        $var->booleon = true;
    }
    $total_object = microtime(true) - $ts_o;
    unset($var);
    
    $ts_a = microtime(true);
    for($i=0;$i<=1000;$i++)
    {
        $var = array();
        $var['booleon'] = true;
    }
    $total_array = microtime(true) - $ts_a;
    
    echo 'Object: ' . ($total_object)  . ' / Array: ' . $total_array;
    

    新结果:0.0037809 / 数组:0.0046189

    您必须进行一些测试,然后在测试结束时找到您的均值/众数,以找到真正更好的实体。

    您可以通过 memory_get_usage : http://php.net/manual/en/function.memory-get-usage.php 使用相同的原理来测试内存。

    【讨论】:

    • IMO 性能考虑不应成为决定是否使用其中一个。
    • 测试给他们写信。测试将它们传递给函数。测试通过引用传递并在函数内部修改它们(提示,使用不需要通过引用传递的对象在函数内部进行修改)。创建可能是使用数组或对象最不常做的事情。谁在乎它们是否便宜,如果它们使用起来很贵......而且,你在谈论1x10^-6的区别......如果你担心那一点点收益,你就是在浪费你的时间.记住,Premature Optimization Is The Root Of All Evil...
    • 但总体而言,性能是任何成功应用程序的主要部分,每当指示决策/实施时都应该解决!
    • +1,早产是万恶之源。
    • 好吧,让我们重新表述一下“在决定使用哪个时,性能考虑不应该是您的主要考虑”。如果他们是一个问题,我们不要忘记new Spl Data Structures and how they perform
    【解决方案3】:

    你在做什么?两种结构都不擅长一切,这就是两者都存在的原因。所以这真的取决于你的问题集“更好”。即便如此,它也可能只是您喜欢的一种情况。很多架构和代码设计都是个人喜好和风格。

    现在,一般来说,只有一次我会在数组上使用无方法对象(stdclass,或自定义对象)。那就是如果我需要大量传递这些数据并在多个地方修改它。对于数组,您需要通过引用传递它,这很麻烦并且会引入错误源...对于对象,默认情况下它作为对象引用传递(不是变量引用,而是指向相同的指针目的)。因此,对于数组,您需要执行以下操作:

    function doSomething($inVar, array &$inOutArray) {
        $inOutArray['bar'] = 'baz';
    }
    

    对于修改(或可能修改)数组的每个函数。

    而对于一个对象,你可以这样做:

    function doSomething($inVar, $object) {
        $object->bar = 'baz';
    }
    

    它更短(当然,只有一个字符,但你可能想修改数组的任何地方都是一个字符)。它不太容易出现错误,因为如果您稍后执行$object = new Something(),它不会更改原始对象(因为它不是变量引用)...

    唯一的论点是它的可读性稍差,因为&amp; 明确显示您打算修改该输入变量。但是,如果您了解对象在 PHP 5 中的工作方式,就不会措手不及(因此在我看来这是一个可以接受的折衷方案)...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2019-07-08
      • 2020-01-05
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多