0

背景:我正在将 CakePHP 用于一个项目,并且想知道当我找到/保存一个列/字段为 NULL 的数据库记录时会发生什么。根据http://goldapplesoftware.ca/blog/2011-09-storing-null-values-database-cakephpCakePHP: 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)我得出的结论或多或少与Check if Variable exists and === true相同。即,您可以检查是否定义了变量(但值为 null)

if (isset($array['x']) && $array['x'] === NULL)

(或者,对于一个数组:

if( array_key_exists('x', $array) && $array['x'] === NULL)

)

我的问题: 我正在寻找关于 PHP 如何在内部处理变量的简明、希望直观的解释。

在思考了我读过的所有内容后,我意识到我拥有的最接近的心理模型是 JavaScript 作用域链(Javascript 中的作用域链)。在 PHP 中定义一个变量似乎将一个符号添加到一个符号表/一个哈希表的条目,将 NULL 分配给该变量不会删除名称,但会导致它的值被 NULL 覆盖,并且 unset 会从桌子。

这甚至接近正在发生的事情吗?有没有人有更好的解释?

4

1 回答 1

1

PHP 处理变量的方式很像 javascript 和其他类似语言的脚本。由于 PHP 是非类型安全的,因此它使用的正是您认为的健壮哈希表。

您可以认为它包含键,这些键是指向这些变量的值的变量名,这些值在大多数情况下可以被认为是字符串。这些键应该保留在范围中,直到不再需要或一旦它们失去范围。因此,如果您将键的值设置为 NULL,则该键仍然存在指向 NULL 的值。但是,如果您想完全删除类似于 C 中的 delete 或 C# 中的 Dispose 的变量,则需要使用 unset 等并从哈希表中完全删除键。

我希望这能回答你的问题。如果您需要更多解释,请告诉我。

于 2013-04-29T07:16:32.583 回答