虽然我被认为可能只是一个设计选择,但将PHP中的属性初始化为显式null
是否有任何优势?
作为一种习惯的力量,我发现自己在做:
// ...
protected $_foo = null;
protected $_bar = null;
protected $_baz = null;
// ...
当然,在实际数据打算出现在对象实例化的情况下,有目的:
// ...
protected $_array = array('a', 'b', 'c');
protected $_boolean = true;
// ...
是否遗漏了null
初始化值完全在功能上等同于包含null
初始化?还有其他警告吗?此外,除非在进行任何分配之前对属性进行类型检查,否则对空数组的初始化似乎是类似的情况(我发现自己经常这样做)
答案 0 :(得分:11)
是的,
protected $_foo = null;
protected $_foo;
完全等同 至于我,很好的选择是
null
清楚地初始化,如果默认情况下null
它可以帮助您快速查看默认值,帮助代码自我记录
不要按array()
初始化数组似乎不好主意,因为你不能使用某些功能(例如array_push
,array_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()语言 构造可用于检测变量是否已经存在 初始化。