属性默认值为 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 的两个声明都将正确返回falseissetis_null 的相反布尔值,如上所述,这些值是 null

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

1:在这种情况下,我指的是为 empty 函数返回 true 的类型值,或者被认为是“falsey”的类型值。 IE。 null0false、空数组 (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 是不是与无默认值相同?的主要内容,如果未能解决你的问题,请参考以下文章

访问对象中的属性与方法

如果值为空,则设置数据库的默认值

java中数组变量名的默认值 如定义int[] a;此时a的默认值应该为null吧,如

SQLite 默认值为 null

关于java中属性变量默认值的问题。

面向对象及内存分析图