25

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

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

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

?

4

3 回答 3

27

无类型属性

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

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

您可以通过对属性执行 a 轻松测试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 文档中的“类型声明”部分了解 properties

于 2012-12-31T04:16:29.790 回答
11

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

是的

根据文档:

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

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

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

isset将正确返回;false的两个声明 是 的相反布尔值,并且这些值是,如上所述,。$fooissetis_nullnull

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

1:在这种情况下,我指的是为empty函数返回 true 的类型值,或者被认为是“falsey”的类型值。IE null, 0, false, 空数组 ( array()) 和空字符串 ( '')。'0'在技​​术上也是空的,尽管我觉得 PHP 作为一种语言很奇怪。

于 2013-01-02T03:30:49.033 回答
2

除了公认的答案仍然正确之外,随着 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;或使用构造函数来这样做。

于 2020-07-30T09:06:49.507 回答