使用magic __get方法时,禁止显示未识别的属性警告

时间:2011-10-27 18:49:38

标签: php class codeigniter warnings

我有一个CI库,它将XML文件中的可翻译内容加载到类中,并且该类有一个magic __get方法,用于检查在引用该属性时是否定义了该属性,如果是,则返回本地化密钥,或者键名和'_#'让我知道如果没有,翻译就会丢失。

一切都很酷。

但是,因为这一切都取决于对象的属性,当我在debug(E_ALL)中运行时,我会收到很多'notice:undefined etc ..'警告,这很烦人。我不想禁用通知,但我想知道如何在这个特定的库中禁用它(如果可能的话)。我可以把@放在每次打电话给班级的前面,但是,这也是非常可怕的。

任何提示?

以下简化的代码段:

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>

1 个答案:

答案 0 :(得分:1)

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

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

这就是你真正需要做的一切。


你的意思是

$this->t->$key

而不是

$this->$key

然后您还需要修复作业:

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

通常,当您在__get函数中检查属性时,您不应该看到任何警告。警告显示您在程序逻辑中出现了一些错误,因此它们很有用,即使代码的一小部分也不应禁用它们。禁用警告不是解决方法,而是修复代码。

如果这有用,请告诉我。