在PHP中存储类变量的最佳方式是什么?

问题描述:

我现在有我的PHP类变量设置是这样的:在PHP中存储类变量的最佳方式是什么?

class someThing { 

    private $cat; 
    private $dog; 
    private $mouse; 
    private $hamster; 
    private $zebra; 
    private $lion; 

    //getters, setters and other methods 
} 

但我也看到了使用单一的阵列来存储所有的变量人:

class someThing { 

    private $data = array(); 

    //getters, setters and other methods 
} 

使用哪做,为什么?每个的优点和缺点是什么?

一般来说,第一个更好的原因是其他人已经在这里陈述过。然而,如果你需要私人地存储数据到一个类中,但是数据成员的足迹是未知的,你会经常看到你的第二个例子与__get()__set()钩子相结合,以隐藏它们正在私人储存。

class someThing { 

    private $data = array(); 

    public function __get($property) 
    { 
     if (isset($this->data[$property])) 
     { 
      return $this->data[$property]; 
     } 
     return null; 
    } 

    public function __set($property, $value) 
    { 
     $this->data[$property] = $value; 
    } 
} 

然后,这个类的对象可用于像一个stdClass的实例,只是没有设置成员实际上是公共

$o = new someThing() 
$o->cow = 'moo'; 
$o->dog = 'woof'; 
// etc 

这种技术有它的用途,但要知道,__get ()和__set()的速度比直接设置公共属性慢10-12倍。

如果您使用的是private $data;,那么您刚刚在那里得到了一个难以理解的数据块......明确指出它们会让您的生活更轻松,如果您想知道一个类是如何工作的。

另一个考虑因素是如果您使用带自动完成功能的IDE - 这不适用于第二种方法。

如果代码是重复的,则数组和(foreach)循环会更新内容。您需要确定代码中的“动物”概念是否重复,或者代码是否需要深入了解每个成员的唯一性。

如果我必须不止一次地重复自己,我会循环。

我更喜欢第一种方法,有几个原因:

在良好的IDE中,类属性显示出来,即使私人/保护 它更容易看到已定义,减少你的机会存储两次相同的信息。 如果众所周知的公交车在回家的路上碰到你,那么其他开发者进来阅读你的代码会简单得多。 虽然它不适用于私有变量,但它确实可以保护变量,在扩展这个类的类中,你应该尽量避免使用纯粹的可读性的第二种方法。另外,作为一个便笺,我几乎总是选择保护私人,除非我有一个非常具体的理由,使其私人。

我可能会使用第二种方法的唯一时间是如果我存储了许多种类的东西的集合。

  • 当你知道你需要这个变量时使用第一种方法。
  • 当您有动态变量需求时,使用第二种方法(变量数组集合)。

你可以结合这两种方法,所以一些变量被硬编码到你的类中,而另一些变量是动态的。与魔法方法相比,硬编码变量将具有偏好。