Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP构造函数之外初始化变量_Php_Oop_Constructor - Fatal编程技术网

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

在PHP构造函数之外初始化变量,php,oop,constructor,Php,Oop,Constructor,我浏览了PHP文档,看到了一些注释,其中一个变量是在类的构造函数之外初始化的,如下所示: classMyClass { private $count = 0; public function __construct() { //Do stuff } } 在PHP对象、模式和实践中,作者建议仅在初始化属性时使用构造,将任何繁重或复杂的逻辑延迟到专门的方法。本教程(我在Google上找到的一个快速示例)还建议使用构造函数初始化属性: 为什么要在构造函数外部

我浏览了PHP文档,看到了一些注释,其中一个变量是在类的构造函数之外初始化的,如下所示:

classMyClass {
    private $count = 0;

    public function __construct() {
        //Do stuff
    }
}
在PHP对象、模式和实践中,作者建议仅在初始化属性时使用构造,将任何繁重或复杂的逻辑延迟到专门的方法。本教程(我在Google上找到的一个快速示例)还建议使用构造函数初始化属性:


为什么要在构造函数外部初始化变量?这只是草率的编码,还是有理由这样做?我不得不说,直到最近,我在构造函数之外初始化了默认值,并且似乎没有任何编程优势。当你在构造函数之外初始化变量时,它必须初始化为常量。您不能执行任何操作来初始化它。因此,该成员的初始值实际上是类签名的一部分

例如,这是无效的:

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

您也可以在构造函数中执行此操作,但如果没有某种逻辑,则会更加冗长,并且会给构造函数添加一些混乱。

与其说是答案,不如说是注释,但请在这里详细说明一下:

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

这是谁说的,为什么?我假设,仅与具有默认值的属性定义以外的内容相关


答案部分:

在PHP中,默认情况下不需要定义变量,因为在写入上下文中首次访问变量时就定义了变量。所有变量(包括未定义的变量)都包含
NULL
():

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

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


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

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

这只是一种很好的编程实践。当您只想初始化简单变量时,很明显,在构造函数之外进行初始化,对于更复杂的初始化,请使用构造函数。您发布的示例是为$count变量提供默认值。提供一个默认值是一个好主意-这样,您就知道要测试什么,以确定在构造函数或其他地方的赋值是否成功。这样,即使在调用构造函数之前,属性也将被声明和初始化。请参阅我对问题的更新-我添加了我想到的源代码好的:一个名为“Killer PHP”和口号为“网页设计师PHP教程”的网站可能不会像你想知道的那样详细。我看不出定义对象属性有什么错误。如果需要,可以稍后进行初始化,但应该定义它们。如果它们的初始值应该不同于
NULL
,而是一个常量表达式,请使用初始值定义它们。这没什么错。事实上,它使构造函数不那么复杂,这是一件好事。构造函数应该是哑巴,不应该做太多。谢谢。我主要感到困惑,因为我看到过好的代码主要是在构造函数外初始化编写的,但我读到的大多数内容似乎都建议在构造函数内初始化。我可以看到它是如何不那么杂乱的(这是做这件事的充分理由),但我还没有发现PHP在构造函数之外为实例属性设置默认值的任何其他实际优势。感谢您深思熟虑的回答。因此,如果为变量分配了一个已知值(如字符串),那么没有理由不在构造函数之外初始化变量?
class A {}

$a = new A;

var_dump($a->property); # 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"