为什么在__construct中定义实例var的类型,而不是在var列表中


Why define type of instance var in the __construct rather than in the var list?

我正在阅读一些代码,看起来像这样:

Class_Menu.php:

<?php
    class Menu {
        private $label;
        private $link;
        private $args;
        function __construct($label, $link, $args=array()) {
            $this->label=$label;
            $this->link=$link;
            $this->args=$args;
        }
...

注意$args是如何在__construct中被定义为数组的。为什么要选择这种方法而不是在var列表中定义$args呢?

<?php
    class Menu {
        private $label;
        private $link;
        private $args=array();
        function __construct($label, $link, $args) {
            $this->label=$label;
            $this->link=$link;
            $this->args=$args;
        }
...

在第一个示例中,$args是可选的。$label$link的构造函数只能用2个参数调用,$args将被定义为一个空数组。

在第二个示例中,需要使用$args参数。

(意见):在声明属性时,我会将$args = array()留在构造函数AND中,这样很容易一眼看出var $args是什么类型。

<?php
    class Menu {
        private $label;
        private $link;
        private $args = array();
        function __construct($label, $link, $args=array()) {
            $this->label=$label;
            $this->link=$link;
            $this->args=$args;
        }

一个允许使用带有两个或三个参数的构造函数(第三个参数是可选的)。

另一个没有。

为什么不阅读函数参数的手册条目?

这只是使$args可选。如果构造函数被调用为new Menu('a', 'b'),那么args将被定义为一个空数组,并且不会因为缺少参数而引发错误。