Frage

Ich lerne Prado-PHP-Framework für eine Weile jetzt, und ich habe über ein Feature schon gefragt, wenn es von PHP ist oder irgendwie in Prado umgesetzt werden.

Das heißt, in Prado verwendeten Klassen können nutzen Eigenschaften (Felder), die nicht in der Klasse deklariert selbst, sondern ‚definiert‘ durch den Satz und Methoden erhalten.

Hier ist ein Beispiel:

class myClass extends somePradoClass {

    public function myPradoMethod() {
        $MyVariable = 22;
        echo $MyOtherVariable; // this one is read only (only get method defined)
    }

    public function getMyVariable() {
        return 0;
    } 

    public function setMyVariable($value) {
        $this->isFieldFromParentClass = $value;
    }

    public function getMyOtherVariable() {
        return $this->isOtherFieldFromParentClass;
    }

}

Nun, irgendwie ist es völlig in Ordnung, $ MyVariable und $ MyOtherVariable in der gesamten Klasse zu verwenden, als ob sie als Klasseneigenschaften deklariert wurden.

Also, Frage wieder: ist dies ein PHP oder Prado Merkmal

Thx

War es hilfreich?

Lösung

Dies ist weder eine PHP-Funktion noch ein Merkmal Prado. Ich weiß nicht, Prado, aber PHP hat nicht solche Funktion, so Prado kann es auch nicht haben;)

Was Sie jedoch suchen, sind Dinge wie diese: $this->myUndefinedMember = $something

Ihr Beispiel verwendet lokale Variablen , diese kann nicht gesetzt sein und lesen von automagically.

Dies wird die Magie __set Methode aufrufen, wenn definiert, ist.

Prado konnte (ich weiß nicht, ob es der Fall ist) definieren diese Methode für einen bestimmten übergeordneten Klasse, dass Sie in der Regel verwenden und dann dynamisch prüfen, ob eine Setter-Methode hat sich für diesen Variablennamen definiert.

Die Signatur wird wie folgt:

public function __set($name, $value)

Die maigc Methode __get($name) arbeitet analog.

Wenn Sie nicht als öffentlich festgelegt, werden Sie nur in der Lage sein, diese Eigenschaft artig verwenden Funktion innerhalb der Klasse (oder Unterklassen).

Als Referenz finden Sie unter hier auf PHP5 die Funktion oder Eigenschaften und Methoden zu überlasten.

Update

Eine Beispielimplementierung könnte wie folgt aussehen:

class MyMagicSuperClass{
    public function __get($name){
        $getter_name = 'get'.ucwords($name);
        if(method_exists($this, $getter_name){
            return $this->$getter_name();
        }

        //error handling
    }

    public function __set($name, $value){
        $setter_name = 'get'.ucwords($name);
        if(method_exists($this, $setter_name){
            return $this->$setter_name($value);
        }

        //error handling
    }
}

Andere Tipps

beantworte ich sehr spät dazu, aber ich fühlte die Antworten sehr aufgeworfen auf eine einfache Funktion verwirrend.

Um eine viel einfachere Antwort zu geben. Irgendwelche Prado-Klassen, die erbt von TComponent verwenden, um die __set und __get Funktionen.

Weitere Informationen über php magic Funktionen hier

Also, wenn u haben eine Funktion, die beginnt mit „get“ oder „set“ werden sie, wenn die Verwendung als Felder der Rest der Funktionsnamen aufgerufen werden.

Dies ist der eigentliche prado Code für __get die __set etwa die gleiche

ist
    public function __get($name)
{
    $getter='get'.$name; $jsgetter = 'getjs'.$name;
    if(method_exists($this,$getter))
    {
        // getting a property
        return $this->$getter();
    }
    else if(method_exists($this,$jsgetter))
    {
        // getting a property
        return (string)$this->$jsgetter();
    }
    else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
    {
        // getting an event (handler list)
        $name=strtolower($name);
        if(!isset($this->_e[$name]))
            $this->_e[$name]=new TList;
        return $this->_e[$name];
    }
    else
    {
        throw new TInvalidOperationException('component_property_undefined',get_class($this),$name);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top