在PHP构造函数之外初始化变量

时间:2012-06-28 16:04:07

标签: php oop constructor

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

classMyClass {
    private $count = 0;

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

PHP对象,模式和实践中,作者建议仅使用构造来初始化属性,将任何繁重的复杂逻辑推迟到专门的方法。本教程(我在Google上找到的一个简单示例)也建议使用构造函数初始化属性:http://www.killerphp.com/tutorials/object-oriented-php/php-objects-page-3.php

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

3 个答案:

答案 0 :(得分:6)

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

例如,这是无效的:

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

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

答案 1 :(得分: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

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

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

$a = new A;

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

由于这是编译 - 但是你的构造函数运行时,我发现很难将这两个特性与另一个特征进行比较。此外,还不清楚为什么要说通过构造函数进行初始化。

答案 2 :(得分:0)

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