我正在浏览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。
为什么要在构造函数之外初始化变量?这只是草率的编码,还是有理由做这样的事情?我不得不说,直到最近,我在构造函数之外初始化了默认值,并且似乎没有任何一种方式优于另一种方式的编程优势。
在构造函数外部初始化变量时,必须将其初始化为常量。 您无法执行任何操作来初始化它。 因此,该成员的初始值实际上是类签名的一部分。
例如,这是无效的:
private $var = $othervar;
private $var = func();
您也可以在构造函数中执行此操作,但它会更冗长一些,并且会给构造函数添加一些混乱,除非有某种逻辑正在进行。
与其说是答案,不如说是评论,但请在这里详细说明一下:
由于建议仅将构造函数用于属性初始化,
谁说的,为什么?我假设唯一与具有默认值的属性定义以外的内容有关。
答案部分:
默认情况下,PHP 中不需要定义变量,因为在写入上下文中首次访问时会定义变量。所有变量,包括未定义的变量都包含NULL
(演示):
class A {}
$a = new A;
var_dump($a->property); # NULL
引入类变量(属性)然后允许PHP实际定义变量。默认情况下,它们仍返回NULL
,但它们已定义(演示):
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"
由于这是编译的 - 但您的构造函数运行时,我发现很难将这两个功能与另一个功能进行比较。也不清楚为什么你说建议通过构造函数初始化。
远非草率...这是很好的编程实践。就像你在 Java/C++ 中所做的那样,它只是设置它们,然后你可以在构造函数中进行任何初始化 - 通常将它们发送到非默认值。