【发布时间】:2013-04-29 15:16:32
【问题描述】:
背景:我正在为一个项目使用 CakePHP,我想知道当我找到/保存一个列/字段为 NULL 的数据库记录时会发生什么。根据http://goldapplesoftware.ca/blog/2011-09-storing-null-values-database-cakephp 和CakePHP: Find where field is not null 看来,CakePHP 会(通常)将 MySQL NULL 列转换为 PHP 的 NULL 值。这对我的直觉很好(DB 中的 NULL => PHP 中的 NULL),但在 PHP 中却出人意料地棘手。
这很棘手,因为 我想检查一个数组槽是否已定义,但其值为 NULL。
在阅读了彻底但令人困惑的http://php.net/manual/en/types.comparisons.php,然后是isset、unset 和几页关于null(包括,最有用的是http://php.net/manual/en/language.types.null.php)后,我得出了与@987654325 或多或少相同的结论@。也就是说,您可以使用
检查是否定义了变量(但值为null)if (isset($array['x']) && $array['x'] === NULL)
(或者,对于数组:
if( array_key_exists('x', $array) && $array['x'] === NULL)
)
我的问题:我正在寻找关于 PHP 如何在内部处理变量的简明、希望直观的解释。
在思考了我读过的所有内容后,我意识到我拥有的最接近的心智模型是 JavaScript 作用域链 (Scope Chain in Javascript)。在 PHP 中定义一个变量似乎将一个符号添加到符号表/哈希表的条目中,将 NULL 分配给该变量不会删除名称,但会导致它的值被 NULL 覆盖,并且 unset 会从表。
这甚至接近正在发生的事情吗?谁有更好的解释?
【问题讨论】:
-
还有
is_null函数来测试null的值。 -
这或多或少实际上是这样工作的:) 将变量的值设置为
null不会将其从符号表中删除。 -
如果你的数组中键'x'的值为NULL,那么你的第一个例如。
if (isset($array['x']) && $array['x'] === NULL)将始终返回 false,因为isset()对于空值返回 false。因此,如果您想检查是否设置了数组键并且可以具有空值,请始终使用array_key_exists() -
@user268396 - 如果变量未设置/未定义,is_null 将出现问题。
-
@ADmad - 疯了!你是对的。 array_key_exists 很方便,我正在寻找一般变量的等价物。