在PHP中初始化属性

时间:2011-08-09 19:42:50

标签: php

虽然我被认为可能只是一个设计选择,但将PHP中的属性初始化为显式null是否有任何优势?

作为一种习惯的力量,我发现自己在做:

// ...
protected $_foo = null;
protected $_bar = null;
protected $_baz = null;
// ...

当然,在实际数据打算出现在对象实例化的情况下,有目的:

// ...
protected $_array = array('a', 'b', 'c');
protected $_boolean = true;
// ...

是否遗漏了null初始化值完全在功能上等同于包含null初始化?还有其他警告吗?此外,除非在进行任何分配之前对属性进行类型检查,否则对空数组的初始化似乎是类似的情况(我发现自己经常这样做

5 个答案:

答案 0 :(得分:11)

是的,

protected $_foo = null;
protected $_foo;

完全等同 至于我,很好的选择是

  • null清楚地初始化,如果默认情况下null
  • 如果在构造函数中将被覆盖,则不进行初始化

它可以帮助您快速查看默认值,帮助代码自我记录

不要按array()初始化数组似乎不好主意,因为你不能使用某些功能(例如array_pusharray_map

答案 1 :(得分:3)

  

完全在功能上省略了空初始化值   相当于包含空初始化?

  

初始化为空数组似乎是类似的情况

没有。您可以尝试foreach ($this->arr)(或其他内容),并且应该使用数组初始化该变量以避免通知。

答案 2 :(得分:2)

属性被隐式初始化为NULL,明确地执行此操作没有任何优势。

答案 3 :(得分:2)

PHP 7.4引入了一个称为“ typed properties”的新功能,该功能将现有的PHP类型系统添加到类属性中。这意味着您现在可以强制执行属性具有的类型,而不必将其封装在对象中。

类型化属性是一个非常有用的功能,但是没有默认值的类型化属性具有一个新状态:uninitialized。而且,如果在初始化之前已访问它们,则会遇到Typed property must not be accessed before initialization错误。

因此,如果您使用的是PHP 7.4+,对OPs问题的正确答案是肯定的,是否显式初始化类变量和以下两行不再等效就很重要了:

protected int $_foo = null;
protected int $_foo; // The default value in PHP 7.4+ is now uninitialized, not NULL

进一步阅读(没有关系):https://madewithlove.com/typed-property-must-not-be-accessed-before-initialization/

答案 4 :(得分:0)

不,......

  

... 不需要在PHP中初始化变量,但它是一个   非常好的做法。未初始化的变量的默认值为   他们的类型取决于使用它们的上下文 - 布尔值   默认为FALSE,整数和浮点数默认为零,字符串(例如   在echo()中使用的设置为空字符串,数组变为   空数组。

但是......:

  

依赖于未初始化变量的默认值是   在将一个文件包含到另一个使用的文件的情况下,有问题   相同的变量名称。它也是一个主要的安全风险   register_globals打开。如果发生E_NOTICE级别错误   使用未初始化的变量,但不是在   将元素附加到未初始化的数组。 isset()语言   构造可用于检测变量是否已经存在   初始化。

来源:http://php.net/manual/en/language.variables.basics.php