首页 > 解决方案 > 为什么类父函数不应该有一个全局 $$Obj 语句

问题描述

在类/对象示例的 php.net 手册中,留下了这个被高度评价的评论

为了避免“未定义变量”错误,class_parentage 函数应该具有全局 $$obj 语句:

function class_parentage($obj, $class) {
        global $$obj;
        if (is_subclass_of($GLOBALS[$obj], $class)) {
            echo "L'objet $obj appartient à la classe " . get_class($$obj);
            echo " une sous-classe de $class\n";
        } else {
            echo "L'object $obj n'appartient pas à une sous-classe $class\n";
        }
    }

请有人解释为什么这是一个不好的建议或为什么反对者是错误的。

标签: phpclassglobal-variablesundefined

解决方案


首先,您通常应该避免使用全局变量,除非确实有必要并且在这种情况下显然不是。全局变量可能会导致许多问题,其中许多是评论者在此处指出的(这是关于 c++,但所有语言中的概念都是相同的)。

但是,他指出文档中提供的代码可能会导致“未定义索引”错误,$global$_GLOBALS.

但解决方案绝对不是为了这个检查而简单地创建一个空的全局变量。事实上,有一个专门设计用于检查数组是否具有特定键的 php 函数:array_key_exists(). 所以正确的解决方案是:

if(!array_key_exists($global, $_GLOBALS)){
   echo "class does not exist"
}

最后,在英语论坛上发布法语文本不是很友好。互联网的通用交流语言是英语,这样的行为在别人看来可能显得傲慢。


推荐阅读