【问题标题】:Concise, intuitive description of how PHP manages variable internally?简明直观地描述 PHP 如何在内部管理变量?
【发布时间】:2013-04-29 15:16:32
【问题描述】:

背景:我正在为一个项目使用 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)后,我得出了与@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 很方便,我正在寻找一般变量的等价物。

标签: php cakephp


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多