Сиқырлы __get әдісін пайдаланғанда белгісіз сипат ескертуін басу

Менде xml файлынан сыныпқа аударылатын мазмұнды жүктейтін CI кітапханасы бар және сыныпта оған сілтеме жасалғанда, сипат анықталғанын тексеретін сиқырлы __get әдісі бар болса, онда жергілікті күйге келтірілген кілт қайтарылса немесе негізгі атау '_ #', егер жоқ болса, аударма жоқ екенін білуіме рұқсат етіңіз.

Барлық салқын.

Дегенмен, бұл барлық объектілердегі қасиеттерге байланысты болғандықтан, мен деблг (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"?>

    
        thing en
        thing pt
    

1

1 жауаптар

Клиенттерді сақтау үшін $ this функциясын қолданғанда __ get тек қана жоқ қасиеттерге шақырылады. Оны өзгертіңіз, сіз ескертуге сіз дұрыс емес нәрсе жасап жатқаныңыз туралы ғана хабарлайтын боласыз:

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

Бұл шынында да қажет нәрсе.


Айтқыңыз келді ме

$this->t->$key

орнына

$this->$key

?

Сонда сіз тапсырманы түзетіңіз:

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

Жалпы алғанда, __ get функциясында сипатты тексергенде сіз қандай да бір ескертуді көрмеуіңіз керек. Ескертулер сізге бағдарлама логикасында қате жібергеніңізді көрсетеді, сондықтан олар пайдалы және оларды тіпті кодтың қысқа бөлігінен ажыратуға болмайды. Ескертулерді өшіру шешім емес, кодты түзету болып табылады.

Маған пайдалы ма екенін біле беріңіз.

1
қосылды
Егер аудармаларды қасиеттер ретінде сақтау үшін $ this сілтемесін қолдансаңыз, __ get жоқ болса ғана шақырылады. Сондықтан сіз оны тексерудің қажеті жоқ. Оның орнына, ол болмайтын жолды қайтарыңыз. Жазылғандай, қатені түзетіп, оны басуға болмайды.
қосылды автор hakre, көзі
@danp: Мен жауапты редакцияладым және сізге қажет сияқты функцияны қосып қойдым.
қосылды автор hakre, көзі
@Danp: Әдепкі параметрлер бойынша, ескертулер ерекше жағдайды тудырмайды. Бірақ сіз дұрыс жерде тұрсыз. Кодты түзетіңіз, ескертулер мәселеде сіз байқағандай қателерді табуға көмектеседі. Бұл дұрыс бағыт. Оған жапсырыңыз;)
қосылды автор hakre, көзі
Кешіріңіз, мен t = new stdClass-ден қателесіп қалдым. Бірақ, сіз маған __get емес, «property_exists» туралы, не шақыруды бастаған сілтеме туралы ескертудің басталуына назар аударуға көмектестіңіз. @ Property_exists алдында ескерту ескертуді басады.
қосылды автор dmp, көзі
Ескерту ескертуді қоспайды ма? Ерекше жағдайды шешкен болсам, ол әлі де дисплейге хабарлама жасайды ма?
қосылды автор dmp, көзі
hakre: мінсіз.
қосылды автор dmp, көзі
@ Қателерді жоюға қою - жаман тәжірибе. Сіз оны пайдаланудан аулақ болуыңыз керек.
қосылды автор Buddy, көзі