donglie7268 2011-10-27 18:49 采纳率: 100%
浏览 65
已采纳

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

I've got a CI Library which loads translatable content from an XML file into a class, and the class has a magic __get method which checks if that property is defined when it is referenced, returning the localised key if so, or the keyname plus '_#' to let me know that translation is missing if not.

All cool.

However, because this all depends on properties on an object, I get lots of 'notice: undefined etc..' warnings when I'm running in debug (E_ALL), and it's annoying. I don't want to disable notices, but i do want to know how to disable this inside this particular library (if possible). I could put @ in front of every call to the class, but again, that's pretty horrible too.

Any tips?

Simplified code snippets below:

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 (just for reference, so it's clear what's happening):

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

1条回答 默认 最新

  • doudou3716 2011-10-27 19:01
    关注

    As you use $this to store the translations, __get is only called on non-existent properties. Change it, the warning you get only notifies you that you're doing something wrong:

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

    That's really all you need to do.


    Did you mean

    $this->t->$key
    

    instead of

    $this->$key
    

    ?

    Then you would need to fix the assignment as well:

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

    In general, as you check for the property in the __get function you should not see any warning. The warnings show you that you've made some error in your program logic, so they are useful and you should not disable them not even for a short part of your code. Disabling warnings is not the solution but fixing the code.

    Let me know if this was helpful.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算
  • ¥15 powerbuilder中的datawindow数据整合到新的DataWindow
  • ¥20 有人知道这种图怎么画吗?
  • ¥15 pyqt6如何引用qrc文件加载里面的的资源
  • ¥15 安卓JNI项目使用lua上的问题
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路