属性默认值为 null 是不是与无默认值相同?
Posted
技术标签:
【中文标题】属性默认值为 null 是不是与无默认值相同?【英文标题】:Is a property default value of null the same as no default value?属性默认值为 null 是否与无默认值相同? 【发布时间】:2012-12-15 08:33:44 【问题描述】:因此我可以安全地重构所有实例
class Blah
// ...
private $foo = null;
// ...
到
class Blah
// ...
private $foo;
// ...
?
【问题讨论】:
【参考方案1】:无类型属性
简单的回答,是的。见http://php.net/manual/en/language.types.null.php
特殊的 NULL 值表示一个没有值的变量。 NULL 是 null 类型的唯一可能值。
您可以通过对属性执行var_dump()
轻松测试,您将看到两个实例都是NULL
class Blah1
private $foo;
function test()
var_dump($this->foo);
$test1 = new Blah1();
$test1->test(); // Outputs NULL
class Blah2
private $foo = NULL;
function test()
var_dump($this->foo);
$test2 = new Blah2();
$test2->test(); // Outputs NULL
类型化属性
PHP 7.4 添加了类型化属性,默认情况下它不像非类型化属性那样默认为null
,而是默认为特殊的“未初始化”状态,如果在写入之前读取属性会导致错误。请参阅PHP docs for properties 上的“类型声明”部分。
【讨论】:
另请注意,error_reporting(E_ALL | E_STRICT);
不能以 $var;
的方式定义变量,但您可以以 public $var;
的方式定义类中的属性(或受保护或私有)。
我认为 error_reporting 与此无关。文档php.net/manual/en/language.oop5.visibility.php 从未展示过这种将属性定义为在任何情况下都有效的方法。【参考方案2】:
属性默认值为 null 和没有默认值一样吗?
是的
as per the docs:特殊的
NULL
值表示一个没有值的变量。
null
是一个尚未设置为任何特定值的变量的概念。在区分 null
和空1 值时,相对容易出错。
private $foo = null;
完全等同于private $foo;
。在这两种情况下,class 属性的值都定义为null
。
isset
对于$foo
的两个声明都将正确返回false
; isset
是 is_null
的相反布尔值,如上所述,这些值是 null
。
作为参考,我建议查看PHP type comparison tables。
1:在这种情况下,我指的是为 empty
函数返回 true 的类型值,或者被认为是“falsey”的类型值。 IE。 null
、0
、false
、空数组 (array()
) 和空字符串 (''
)。 '0'
在技术上也是空的,虽然我觉得 PHP 作为一种语言很奇怪。
【讨论】:
【参考方案3】:除了公认的答案仍然正确之外,随着 PHP 7.4 中添加类型属性的添加,还有一些新的事情需要考虑。
给定以下代码
class A
public ?DateTime $date;
$a = new A();
$a->date;
你会得到错误
PHP Fatal error: Uncaught Error: Typed property A::$date must not be accessed before initialization
这意味着$date
属性不会自动使用null
进行初始化,即使这是一个有效值。您必须像 public ?DateTime $date = null;
一样直接初始化它,或者使用构造函数来这样做。
【讨论】:
谢谢!我认为现在接受的答案不正确,因为它仅适用于无类型属性。正确答案应涵盖类型和非类型属性,因为问题没有指定。以上是关于属性默认值为 null 是不是与无默认值相同?的主要内容,如果未能解决你的问题,请参考以下文章