8

我正在查看 PHP 文档并看到一些注释,其中变量是在类的构造函数之外初始化的,类似于以下内容:

classMyClass {
    private $count = 0;

    public function __construct() {
        //Do stuff
    }
}

PHP Objects, Patterns, and Practice中,作者建议仅将构造用于属性的初始化,将任何繁重的工作或复杂的逻辑推迟到专门的方法中。本教程(我在 Google 上找到的一个快速示例)还建议使用构造函数来初始化属性:http ://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.php 。

为什么要在构造函数之外初始化变量?这只是草率的编码,还是有理由做这样的事情?我不得不说,直到最近,我在构造函数之外初始化了默认值,并且似乎没有任何一种方式优于另一种方式的编程优势。

4

3 回答 3

7

在构造函数之外初始化变量时,必须将其初始化为常量。你不能做任何操作来初始化它。因此,该成员的初始值实际上是类签名的一部分。

例如,这是无效的:

private $var = $othervar;
private $var = func();

您也可以在构造函数中执行此操作,但它会更加冗长,并且会在构造函数中添加一些混乱,除非有某种逻辑正在发生。

于 2012-06-28T16:07:56.720 回答
2

评论多于答案,但请在此处详细说明:

由于建议仅将构造函数用于属性初始化,

这是谁说的,为什么?我认为唯一与具有默认值的属性定义无关。


回答部分:

默认情况下,不需要在 PHP 中定义变量,因为变量是在第一次在写上下文中访问时定义的。所有变量,包括未定义的变量都包含NULLDemo):

class A {}

$a = new A;

var_dump($a->property); # NULL

引入类变量(属性) PHP 然后允许实际定义变量。那些仍然NULL默认返回,但它们被定义Demo):

class A {
    public $property;
}

$a = new A;

var_dump($a->property); # NULL

在进化的下一步中,这种语言结构还允许指定一个常量表达式。这是恒定的,因为定义是编译时的(而不是调用构造函数时的运行时)。一个例子(演示):

class A {
    public $property = 'hello';
}

$a = new A;

var_dump($a->property); # string(5) "hello"

由于这是可编译的,但您的构造函数运行时,我发现很难将这两个功能与另一个进行比较。此外,还不清楚您为什么说建议通过构造函数进行初始化。

于 2012-06-28T16:08:04.537 回答
0

绝非草率……这是一种很好的编程习惯。正如您在 Java/C++ 中所做的那样,它只是设置它们,然后您可以在构造函数中进行任何初始化 - 通常将它们发送到非默认值。

于 2012-06-28T16:08:25.500 回答