Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在PHP中存储类变量的最佳方法是什么?_Php_Variables - Fatal编程技术网

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

什么';在PHP中存储类变量的最佳方法是什么?,php,variables,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

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

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

如果您使用的是
私有$data那里有一个无法穿透的数据块。。。如果你想弄清楚一个类是如何工作的,那么明确地说明它们会让你的生活变得更加轻松


另一个需要考虑的问题是,如果您使用带有自动完成功能的IDE,那么第二种方法将不起作用。

如果代码是重复的,那么数组和(foreach)循环会使事情变得整洁。您需要确定代码中的“动物”概念是否重复,或者代码是否需要挖掘每个成员的唯一性


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

一般来说,第一个更好,因为其他人已经在这里说明了原因

但是,如果您需要在类上私下存储数据,但数据成员的占用空间未知,那么您经常会看到第二个示例与_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

这项技术有其用途,但请注意uu get()和u set()的速度大约是直接设置公共属性的10-12倍。

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

在一个好的IDE中,即使是私有/受保护的,也会显示类属性 更容易查看已定义的内容,从而减少两次存储相同信息的机会。 如果你在回家的路上遇到了众所周知的总线,那么其他开发人员进来阅读你的代码就简单多了。 虽然它不适用于私有变量,但它适用于受保护的变量,在扩展这个类的类中,为了纯粹的可读性,您确实应该避免使用第二种方法

另外,作为旁注,我几乎总是选择受保护而不是隐私,除非我有一个非常具体的理由让它成为隐私

我唯一可能使用第二种方法的时候是,如果我正在存储一种东西的许多集合。

  • 当您知道需要该变量时,请使用第一种方法
  • 当您需要动态变量时,请使用第二种方法(变量的数组集合)
您可以将这两种方法结合起来,因此一些变量是硬编码到类中的,而另一些是动态的。与magic方法相比,硬编码变量具有更高的优先级