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


Why declare class' properties when constructor initialize this properties

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

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是在类实例化时初始化的,所以直接在类中声明属性是无用的,不是吗?

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

在第二个示例中,您的变量将是公共的,因为它们是动态生成的。

当你的构造函数会大得多时,作为开发人员找出你的变量被引入的位置是一件很痛苦的事情.
最好为类中的变量设置默认值(如果它们始终相同),而不是构造函数。它使您的代码更具可读性和可理解性。

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

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

此代码收集自 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'));
?>

输出:

字符串(5) "你好"
已访问私有方法。

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

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