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

Php null的属性默认值是否与无默认值相同?,php,properties,null,default-value,Php,Properties,Null,Default Value,因此,我可以安全地重构 class Blah { // ... private $foo = null; // ... } 到 ?非类型属性 答案很简单,是的。看 特殊的NULL值表示没有值的变量。空是 类型为null的唯一可能值 您可以通过对属性执行var\u dump()来轻松测试,您将看到这两个实例都是NULL class Blah1 { private $foo; function test() { var_dump($

因此,我可以安全地重构

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

非类型属性 答案很简单,是的。看

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

您可以通过对属性执行
var\u 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
,而是默认为特殊的“未初始化”状态,如果在写入属性之前读取该属性,则会导致错误。请参阅上的“类型声明”部分

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

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

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

private$foo=null
完全等同于
私有$foo。在这两种情况下,class属性的值都是
null

isset
将为
$foo
的两个声明正确返回
false
isset
是与
is_null
相对的布尔值,如上所述,这些值是
null

为了便于参考,我建议查看


1:在本例中,我指的是为函数返回true的类型化值,或者被认为是“false”的类型化值。即
null
0
false
、空数组(
array()
)和空字符串(
'
)<代码> '0' 在技术上也是空的,虽然我发现它是PHP的一种奇特的语言。

< P>除了所接受的答案仍然是真的,在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或使用构造函数执行此操作。

还请注意,使用
错误报告(E|u ALL | E|u STRICT)不能用
$var
,但您可以通过
public$var(或受保护或私有)。我认为错误报告与此无关。文档从来没有显示过这样一种定义属性的方法在任何情况下都是有效的。谢谢!我认为现在公认的答案是不正确的,因为它只适用于非类型属性。正确答案应该包括类型化和非类型化属性,因为问题没有指定。
PHP Fatal error:  Uncaught Error: Typed property A::$date must not be accessed before initialization