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

时间:2009-02-13 15:42:33

标签: php variables

我目前的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
}

你使用哪种,为什么?每种方法的优点和缺点是什么?

5 个答案:

答案 0 :(得分:11)

一般来说,第一种情况比其他人已在此处所述的原因更好。

但是,如果您需要私有地在类上存储数据,但数据成员的占用空间未知,您通常会看到第二个示例与__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倍。

答案 1 :(得分:6)

如果您正在使用private $data;,那么您刚刚获得了难以理解的大量数据......明确说明它们会让您的生活变得更加容易,如果您正在弄清楚课程的运作方式。

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

答案 2 :(得分:1)

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

如果我不得不多次重复自己,我会循环。

答案 3 :(得分:1)

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

您可以将这两种方法结合起来,因此有些变量会硬编码到您的类中,而其他变量则是动态的。与魔术方法相比,硬编码变量具有偏好。

答案 4 :(得分:0)

我更喜欢第一种方法,原因如下:

在一个好的IDE中,即使私有/受保护,类属性也会显示出来 更容易看到已经定义的内容,减少了两次存储相同信息的可能性。 如果众所周知的公共汽车在回家的路上遇到你,那么另一个开发人员进入并阅读你的代码要简单得多。 虽然它不适用于私有var,但它对受保护的变量有效,在扩展此类的类中,你真的应该尽量避免使用第二种纯可读性方法。

另外,作为附注,除非我有一个非常具体的理由将其设为私有,否则我几乎总是选择受保护而不是私有。

我唯一可能使用第二种方法的方法是,如果我存储了许多类似物的集合。