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

时间:2012-12-31 03:57:16

标签: php properties null default-value

因此我可以安全地重构

的所有实例
class Blah
{
    // ...
    private $foo = null;
    // ...
}

class Blah
{
    // ...
    private $foo;
    // ...
}

3 个答案:

答案 0 :(得分:23)

简单回答,是的。见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

答案 1 :(得分:9)

  

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

<子> as per the docs:
  

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

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

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

对于isset的两个声明,

false将正确返回$foo; issetis_null的布尔相反,如上所述,这些值为null

作为参考,我建议您查看PHP type comparison tables

1:在这种情况下,我指的是对empty函数返回true的类型值,或者被认为是“falsey”的类型值。 I.E. null0false,空数组(array())和空字符串('')。 '0'在技术上也是空的,虽然我发现它是一种奇怪的PHP语言。

答案 2 :(得分:1)

除了公认的答案仍然是正确的以外,在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;一样直接对其进行初始化,或者使用构造函数来进行初始化。