属性默认值null是否与默认值相同?

Jes*_*sse 23 php null properties default-value

因此,我可以安全地重构所有的实例

class Blah
{
    // ...
    private $foo = null;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

class Blah
{
    // ...
    private $foo;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

cry*_*c ツ 23

答案很简单,是的.见http://php.net/manual/en/language.types.null.php

特殊的NULL值表示没有值的变量.NULL是null类型唯一可能的值.

您可以通过var_dump()在属性上执行a来轻松地进行测试,您将看到它们将是两个实例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
Run Code Online (Sandbox Code Playgroud)


zzz*_*Bov 10

属性默认值null是否与默认值相同?

按照文档:

特殊NULL值表示没有值的变量.

null是一个未设置为任何特定值的变量的概念.区分null和清空1值时相对容易出错.

private $foo = null;完全等同于private $foo;.在这两种情况下,class属性都定义为值null.

isset将正确返回false两个声明$foo; isset是布尔的反义is_null,并且这些值如上所述null.

作为参考,我建议查看PHP类型比较表.

1:在这种情况下,我指的是为empty函数返回true的类型值,或者其他被认为是"falsey"的值.IE null,0,false,空阵列(array()),并且空字符串('').'0'在技​​术上也是空的,虽然我发现它是一种奇怪的PHP作为一种语言.


Mar*_*fer 5

除了仍然正确的公认答案之外,随着 PHP 7.4 中添加类型化属性,还有一些新的事情需要考虑。

给出以下代码

class A {
    public ?DateTime $date;
}

$a = new A();
$a->date;
Run Code Online (Sandbox Code Playgroud)

你会得到错误

PHP 致命错误:未捕获错误:初始化之前不得访问类型化属性 A::$date

这意味着即使这是一个有效值,该属性$date也不会自动初始化。null您必须像直接初始化它一样public ?DateTime $date = null;或使用构造函数来执行此操作。

  • 谢谢你!我认为现在接受的答案不正确,因为它仅适用于非类型化属性。正确的答案应该涵盖类型化和非类型化属性,因为问题没有指定。 (2认同)