Onderdruk ongeïdentificeerde eigenschapwaarschuwing bij gebruik van de magische __get-methode

Ik heb een CI-bibliotheek die vertaalbare inhoud uit een XML-bestand naar een klasse laadt, en de klasse heeft een magische __get-methode die controleert of die eigenschap is gedefinieerd wanneer ernaar wordt verwezen, de gelokaliseerde sleutel als dat zo is, of de keyname plus '_ #' om me te laten weten dat de vertaling ontbreekt, zo niet.

Alles cool.

Omdat dit echter allemaal afhangt van de eigenschappen van een object, krijg ik veel 'notice: undefined etc ..' waarschuwingen als ik in foutopsporing (E_ALL) loop en dat is vervelend. Ik wil mededelingen niet uitschakelen, maar ik wil weten hoe ik dit in deze specifieke bibliotheek (indien mogelijk) uit kan schakelen. Ik zou @ kunnen plaatsen voor elke oproep aan de klas, maar nogmaals, dat is ook behoorlijk vreselijk.

Enige tips?

Vereenvoudigde codefragmenten hieronder:

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 (alleen ter referentie, dus het is duidelijk wat er gebeurt):

<?xml version="1.0" encoding="UTF-8"?>

    
        thing en
        thing pt
    

1

1 antwoord

Terwijl u $ this gebruikt om de vertalingen op te slaan, wordt __ get alleen aangeroepen voor niet-bestaande eigenschappen. Verander het, de waarschuwing die u krijgt, geeft alleen aan dat u iets verkeerd doet:

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

Dat is echt alles wat u hoeft te doen.


Bedoelde je

$this->t->$key

in plaats van

$this->$key

?

Dan zou je de opdracht ook moeten repareren:

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

Over het algemeen moet u bij het controleren van de eigenschap in de functie __ get geen enkele waarschuwing zien. De waarschuwingen laten zien dat je een fout hebt gemaakt in je programmalogica, dus ze zijn handig en je moet ze niet uitschakelen, zelfs niet voor een klein deel van je code. Het uitschakelen van waarschuwingen is niet de oplossing, maar het repareren van de code.

Laat me weten of dit nuttig was.

1
toegevoegd
Als u $ this gebruikt om de vertalingen als eigenschappen op te slaan, wordt __ get alleen gebruikt als deze niet bestaat. U hoeft dus niet eens te controleren. In plaats daarvan retourneert u alleen de tekenreeks dat deze niet bestaat. Zoals geschreven, zou u de fout moeten herstellen, niet onderdrukken.
toegevoegd de auteur hakre, de bron
@danp: ik heb het antwoord bewerkt en je hebt de functie toegevoegd zoals je hem nodig hebt.
toegevoegd de auteur hakre, de bron
@Danp: standaardconfiguratie, waarschuwingen activeren geen uitzondering. Maar je kijkt naar de verkeerde plaats. Los de code op, de waarschuwingen helpen u bij het lokaliseren van fouten zoals u al opmerkt in uw vraag. Dat is de goede richting. Vasthouden aan het ;)
toegevoegd de auteur hakre, de bron
Sorry, ik heb per ongeluk die t = nieuwe stdClass achtergelaten. Maar je hebt me geholpen om te focussen op waar de waarschuwing werd geactiveerd - op de 'property_exists' niet op de __get, noch de referentie die die call initieert. Door @ voor property_exists te plaatsen, werd de waarschuwing onderdrukt.
toegevoegd de auteur dmp, de bron
Brengt een waarschuwing een uitzondering teweeg? Als ik de uitzondering zou behandelen, zou deze dan nog steeds een melding op het display activeren?
toegevoegd de auteur dmp, de bron
hakre: perfect.
toegevoegd de auteur dmp, de bron
Putting @ om fouten te onderdrukken is een slechte gewoonte. Gebruik het niet.
toegevoegd de auteur Buddy, de bron