【问题标题】:Setting variable to null confusion将变量设置为空混淆
【发布时间】:2016-04-20 18:37:58
【问题描述】:

这很好用

<?php
error_reporting(E_ALL);
$a = null;
var_dump($a); // outputs no notice and NULL

但这会产生一个通知?

<?php
error_reporting(E_ALL);
$a;
var_dump($a); // outputs a notice followed by NULL

这行得通

<?php
error_reporting(E_ALL);
class some_class
{
    private $a;

    public static $b;

    public function __construct()
    {
        echo var_dump($this->a); // outputs NULL
    }
}
var_dump(some_class::$b); // outputs NULL
new some_class();

【问题讨论】:

  • 您的问题是什么? $a; 不是有效的分配。
  • 在第二个示例中,您没有将$a 设置为null,但是当您尝试访问未定义的变量时,它是默认显示。
  • @mistermartin 我想我会希望在声明$a;而不是尝试在var_dump($a);访问它时出现通知?
  • @MonkeyZeus 我对我之前发布的答案进行了一些编辑,概述了正在发生的事情,但不确定您是否确实看到了它们(编辑)。我希望它对这个主题有所启发;-)(另请参见代码中的 cmets)。
  • @Fred-ii- 感谢您的详细回答。我想我的问题是我理解这种行为,但我只是不明白为什么独立的$a; 没有产生通知。请看我的更新。这是否意味着 PHP 在编译时会将未分配的类属性初始化为 NULL?

标签: php variables null


【解决方案1】:

给未来读者的注意事项。

此答案基于原始帖子,在介绍使用 https://stackoverflow.com/revisions/36752382/1 类之前,未标记为附加编辑。


"后跟 NULL"

  • 这是正常行为。

来自变量基础手册http://php.net/manual/en/language.variables.basics.php

“在 PHP 中没有必要初始化变量,但这是一个非常好的做法。未初始化的变量具有其类型的默认值,具体取决于使用它们的上下文 - 布尔值默认为 FALSE,整数和浮点数默认为零,字符串(例如在 echo 中使用)设置为空字符串,数组变为空数组。”

示例#1 未初始化变量的默认值

<?php
// Unset AND unreferenced (no use context) variable; outputs NULL
var_dump($unset_var);

// Boolean usage; outputs 'false' (See ternary operators for more on this syntax)
echo($unset_bool ? "true\n" : "false\n");
  • 注意outputs NULL,即使是未定义的变量。

“@misterartin 我想我会希望在声明 $a; 而不是尝试在 var_dump($a); 处访问它时出现通知?– MonkeyZeus”

那是因为您没有尝试以任何方式、形状或形式访问它。

只是做:(我可能会添加一个有效的声明)

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$a; // Awaits further instructions. Won't complain till then.

在您介绍 var_dump(); 或任何其他可能使用它的有效函数之前,不会发出通知。

  • 把它想象成地面上的气体就在你的脚边。在您引入点燃的火柴(或 Zippo)之前,它不会有太大的作用。

另一个没有var_dump() 的“echo”会抛出一个通知,但没有 NULL。

即:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
echo $a; // This will make it complain, as will var_dump($a); in its place.

投掷:

注意:未定义变量:/path/to/file.php 第 x 行中的 a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2016-01-14
    • 2012-11-07
    • 1970-01-01
    • 2011-04-30
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多