Domanda

Sto imparando Prado quadro php per un po ', e mi sono chiesto su una caratteristica, se è da PHP o in qualche modo implementato in Prado.

Vale a dire, le classi utilizzate in Prado possono utilizzare proprietà (campi) che non vengono dichiarati nella classe stessa, ma 'definiti' da set e ottenere metodi.

Ecco un esempio:

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;
    }

}

Ora, in qualche modo, è perfettamente bene di utilizzare $ MyVariable e $ MyOtherVariable tutta la classe, come se fossero dichiarati come proprietà della classe.

Quindi, domanda ancora:? questa è una funzione PHP o Prado

Thx

È stato utile?

Soluzione

Questa non è né una caratteristica di PHP né una caratteristica del Prado. Non so Prado, ma PHP non ha tale caratteristica, in modo da Prado non può avere neanche;)

Quello che state cercando tuttavia, sono cose come questa: $this->myUndefinedMember = $something

Il tuo esempio utilizza le variabili locali , questi non possono da impostare e leggere da automagicamente.

In questo modo richiamare il metodo magico __set, se definito che sia.

Prado potrebbe (non so se lo fa) definiscono questo metodo per un certo superclasse che di solito si usa e poi dinamicamente verificare se un metodo setter è stato definito per quel nome di variabile.

La firma è la seguente:

public function __set($name, $value)

Il metodo maigc __get($name) funziona in modo analogo.

Se non si imposta come pubblico, si sarà solo in grado di utilizzare questa proprietà come funzione all'interno della classe (o sottoclassi).

A titolo di riferimento, vedi qui sulla funzione di PHP5 o sovraccarico proprietà e metodi.

Aggiorna

Un esempio di implementazione potrebbe assomigliare a questo:

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
    }
}

Altri suggerimenti

rispondo molto tardi per questo, ma ho sentito le risposte poste molto confusa per una caratteristica semplice.

Per dare una risposta molto più semplice. Tutte le classi Prado che eredita da TComponent utilizzare le funzioni __set e __get.

Di più su funzioni magiche php qui

Quindi, se u avere una funzione che inizia con "get" o "set" saranno chiamati quando uso il resto del nome della funzione come campi.

Questo è il codice prado effettivo per la __get __set è circa lo stesso

    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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top