Подавить предупреждение о неопознанном свойстве при использовании магического метода __get - PullRequest
1 голос
/ 27 октября 2011

У меня есть библиотека CI, которая загружает переводимый контент из XML-файла в класс, и у класса есть магический метод __get, который проверяет, определено ли это свойство при обращении к нему, возвращая локализованный ключ, если это так, илиимя ключа плюс '_ #', чтобы сообщить, что перевод отсутствует, если нет.

Все круто.

Однако, поскольку все это зависит от свойств объекта, я получаю много предупреждений «note: undefined etc ...» при запуске в режиме отладки (E_ALL)и это раздражает.Я не хочу отключать уведомления, но я хочу знать, как отключить это внутри этой конкретной библиотеки (если это возможно).Я мог поставить @ перед каждым звонком в классе, но опять же, это тоже довольно ужасно.

Любые советы?

Ниже приведены упрощенные фрагменты кода:

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 Ответ

1 голос
/ 27 октября 2011

Поскольку вы используете $this для хранения переводов, __get вызывается только для несуществующих свойств. Измените его, предупреждение, которое вы получаете, только уведомляет вас, что вы делаете что-то не так:

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

Это действительно все, что вам нужно сделать.


Вы имели в виду

$this->t->$key

вместо

$this->$key

Тогда вам также необходимо исправить назначение:

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

В целом, когда вы проверяете свойство в функции __get, вы не должны видеть никаких предупреждений. Предупреждения показывают, что вы допустили некоторые ошибки в логике вашей программы, поэтому они полезны, и вы не должны отключать их даже для короткой части вашего кода. Отключение предупреждений - это не решение, а исправление кода.

Дайте мне знать, если это было полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...