为什么在构造函数初始化此属性时声明类的属性

时间:2016-02-23 08:15:08

标签: php oop

写出什么是最好的,为什么?

class Chat
{
    private $_couleur;
    private $_race;

    function __construct($couleur, $race)
    {
        $this->_couleur = $couleur;
        $this->_race = "$race";
    }

    public function getCouleur() {
        return $this->_couleur;
    }
}

或者

class Chat
{
    function __construct($couleur, $race)
    {
        $this->_couleur = $couleur;
        $this->_race = "$race";
    }

    public function getCouleur() {
        return $this->_couleur;
    }
}

因为在实例化类时初始化$this->_couleur,所以直接在类中声明属性是没用的,不是吗?

4 个答案:

答案 0 :(得分:7)

在类的顶部声明变量是一种非常好的做法,因为它使任何读取代码的人都清楚该类具有私有的属性以及该类具有哪些属性公共

在第二个例子中,你的变量将是公开的,因为它们是动态生成的。

当你的构造函数变得更大时,作为开发人员的屁股很难找到引入变量的位置。
将默认值(如果它们始终相同)设置为类中与构造函数相对应的变量也是很好的。它使您的代码更具可读性和可理解性。

答案 1 :(得分:1)

第一块代码比第二块更好,但在第一块中有一件事。

相同类型的对象可以访问彼此私有和受保护的成员,即使它们不是同一个实例。这是因为在这些对象内部已经知道实现特定的细节。

此代码来自php.net

<?php
class Test
{
    private $foo;

    public function __construct($foo)
    {
        $this->foo = $foo;
    }

    private function bar()
    {
        echo 'Accessed the private method.';
    }

    public function baz(Test $other)
    {
        // We can change the private property:
        $other->foo = 'hello';
        var_dump($other->foo);

        // We can also call the private method:
        $other->bar();
    }
}

$test = new Test('test');

$test->baz(new Test('other'));
?>

<强>输出:

  

string(5)“你好”
  访问私有方法。

答案 2 :(得分:0)

第一个更好。您实际上是将变量声明为私有,为它们提供了有意义的范围。第二个版本更容易出错。

答案 3 :(得分:0)

只想添加一个声明类属性的简单好处:任何好的IDE都会从声明的类属性中解析并构建符号表。因此,如果您正在编写一个类并开始输入store.url=file:///some/path,将显示已声明属性的列表,以便您可以轻松选择要使用的属性。如果您在构造函数中创建变量而未声明它们,则您的IDE将无法看到它们。