【问题标题】:What is better stdClass or (object) array to store related data?什么是更好的 stdClass 或(对象)数组来存储相关数据?
【发布时间】:2013-09-09 12:58:24
【问题描述】:

长期以来,我一直在使用数组来存储相关字段。如果我想拥有相关的用户字段,我使用:

$user = array(
   'id' => 27
   'name' => 'Pepe'
);

但最近,我一直在处理对象,我更喜欢使用 $user->id 而不是 $user['id']。

我的问题:要实现面向对象的风格,你可以使用stdClass:

$user = new stdClass();
$user->id = 27;
$user->name = 'Pepe';

或从数组中强制转换

$user = (object) array(
  'id' => 27
, 'name' => 'Pepe'
);

其中一个比另一个更好,按照性能和风格的顺序,还是你可以模糊地使用你想要的任何东西?

谢谢!

更新: 我同意所有的 cmets,这根本不是 OOP,只是将相关数据分组到一个结构中。我的 $user 示例不是最好的,因为它是使用具有方法、属性、blablabla 的类的典型示例......我问是因为我有很多配置结构,比如我们的“initTable”,我想要类似的东西:

$table => page => init => 1
               => end  => 25
          sort => field => name
               => order => asc

等等,我想知道什么更好的获取初始化页面:

$table->page->init **OR** $table['page']['init']

【问题讨论】:

  • 在内存使用和一般性能方面,我本能地说创建一个对象比创建一个数组并将其转换为一个对象要好。
  • 对象中有东西,并不意味着你使用OOP。
  • 如果您使用实际的类型化对象,您的 IDE 可以执行智能感知/正确性检查。主观上,这比这些选择之间的微观差异更有用。
  • 如果你真的想做 OOP 使用类。
  • @JimmyT.:同意。 stdClass(object) array 最终给了你同样的东西......它基本上是一个具有时髦语法、引用语义的数组,并且缺少大多数使数组 对象值得的东西。 OOP 涉及将行为附加到数据,您不能这样做。

标签: php oop object


【解决方案1】:

基于小测试 (http://phpfiddle.org/lite/code/cz0-hyf) 我可以说使用“new stdClass()”比其他选项慢大约 3 倍。

这很奇怪,但是与 stdClass 相比,强制转换数组非常有效。

但是这个测试只测量执行时间。它不计量内存。

附:我只使用 phpFiddle 来共享代码。测试是在我的本地 PC 上完成的。

【讨论】:

    【解决方案2】:

    我不认为将数组移动到标准对象会有所不同。除了您不能再使用大部分array_* 功能。
    我看不出使用动态对象比索引数组有任何优势。

    在这种情况下,我将为您需要的每个元素和属性创建一个类。

    class User
    {
        protected $id;
        protected $name;
    
        public function __construct($id = null, $name = null)
        {
            $this->id   = $id;
            $this->name = $name;
        }
    
        public function getName()
        {
            return $this->name;
        }
    
        public function setName($name)
        {
            $this->name = $name;
        }
    }
    

    有了这样的设计,你就知道自己有什么样的参数了。

    $user  = new User(21, 'Foo');
    echo $user->getName(); // Foo
    
    $blank = new User(22);
    echo $blank->getName(); // NULL
    

    没有错误,不再检查。
    使用arraystdClass 你会得到类似的东西

    $user = array('id' => 21, 'name' => 'Foo');
    echo $user['name']; // Foo
    
    $blank = array('id' => 22);
    echo $blank['name']; // NOTICE: Undefined offset
    echo isset($blank['name']) ? $blank['name'] : null; // NULL
    

    对于这种行为,拥有一个你知道界面的实体对象更容易维护和扭曲。

    【讨论】:

      【解决方案3】:

      尝试调查问题,这里每个测试做 1.000.000 次:

      $start = microtime(true);
      for ($i=0;$i<1000000;$i++) {
          $user = new stdClass();
          $user->id = 27;
          $user->name = 'Pepe';
      }
      $end = microtime(true);
      echo $end - $start;
      
      echo '<br><br>';
      
      $start = microtime(true);
      for ($i=0;$i<1000000;$i++) {
          $user = (object) array(
              'id' => 27, 
              'name' => 'Pepe'
          );
      }
      $end = microtime(true);
      echo $end - $start;
      

      报告

      0.75109791755676
      0.51117610931396
      

      所以 - 显然在这种特殊情况下 - 从数组转换是最快的方法。以许多百分比击败stdClass。但我不会将其视为普遍的普遍规则或法律。

      【讨论】:

        猜你喜欢
        • 2013-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-12
        • 1970-01-01
        • 2020-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多