【问题标题】:Suppress unidentified property warning when using magic __get method使用魔术 __get 方法时抑制未识别的属性警告
【发布时间】:2011-10-27 18:49:38
【问题描述】:

我有一个 CI 库,它将 XML 文件中的可翻译内容加载到一个类中,并且该类有一个神奇的 __get 方法,该方法检查该属性是否在被引用时定义,如果是则返回本地化键,或者键名加上 '_#' 让我知道如果没有,则缺少翻译。

很酷。

但是,因为这一切都取决于对象的属性,所以当我在调试 (E_ALL) 中运行时,我会收到很多“通知:未定义等”警告,这很烦人。我不想禁用通知,但我确实想知道如何在这个特定的库中禁用它(如果可能的话)。我可以在每个班级的电话前面加上@,但同样,这也很糟糕。

有什么建议吗?

下面的简化代码sn-ps:

class MY_Translation
{

    function _get_keys($lang) {
        // load xml translations, could split this into different files..

        $translations = new DOMDocument();
        $translations->load($_SERVER['DOCUMENT_ROOT']."/xml/translations.xml");
        if ($translations) {
            $words = $translations->getElementsByTagName("word");
            $count = 0;
            foreach( $words as $word ){

                $name = $word->getAttribute('name');
                $trans = $word->childNodes;

                if ($trans->length > 0) {
                    for($i = 0; $i < $trans->length; $i++) {
                        $child = $trans->item($i); 

                        if ($child->nodeName == $lang) {
                            $this->$name = $child->nodeValue;
                        }
                    }
                }
            }   
        }
    }

    function __get($key){
        if (property_exists('MY_Translation',$this->$key)) {
            return $this->$key;
        } else {
            return $key."_#";
        }
    }

}

XML(仅供参考,所以很清楚发生了什么):

<?xml version="1.0" encoding="UTF-8"?>
<words>
    <word name="thing">
        <en>thing en</en>
        <pt>thing pt</pt>
    </word>
</words>

【问题讨论】:

    标签: php class codeigniter warnings


    【解决方案1】:

    当您使用$this 存储翻译时,__get 仅在不存在的属性上调用。更改它,您收到的警告只会通知您您做错了什么:

    function __get($key)
    {
        return $key."_#";
    }
    

    这就是你真正需要做的。


    你是说

    $this->t->$key
    

    而不是

    $this->$key
    

    ?

    那么您还需要修复分配:

    $this->t->$name = ...
    

    一般来说,当您检查__get 函数中的属性时,您应该不会看到任何警告。警告表明您在程序逻辑中犯了一些错误,因此它们很有用,您不应该禁用它们,即使是一小部分代码也不行。禁用警告不是解决方案,而是修复代码。

    如果这有帮助,请告诉我。

    【讨论】:

    • 抱歉,我不小心把 t = new stdClass 留在了里面。但是,您帮助我专注于触发警告的位置 - 在 'property_exists' 而不是 __get 上,也不是启动该调用的引用。将 @ 放在 property_exists 前面会抑制警告。
    • 使用@ 来抑制错误是一种不好的做法。你应该避免使用它。
    • 如果你引用$this 将翻译存储为属性,__get 只会在它不存在时被调用。所以你甚至不需要检查它。而是只返回它不存在的字符串。正如所写,您应该修复错误,而不是抑制它。
    • @danp:我编辑了答案并添加了您应该需要的功能。
    • 警告会触发异常吗?如果我处理了异常,它还会触发显示通知吗?
    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 2011-06-10
    • 2010-12-26
    • 2010-11-19
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    相关资源
    最近更新 更多