Question

J'apprends cadre Prado php pour un certain temps maintenant, et je me suis demandé au sujet d'une fonctionnalité, si elle est de PHP ou en quelque sorte mis en œuvre dans le Prado.

A savoir, les classes utilisées à Prado peuvent utiliser des propriétés (champs) qui ne sont pas déclarées dans la classe elle-même, mais « définis » par ensemble et obtenir des méthodes.

Voici un exemple:

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

}

Maintenant, en quelque sorte, il est tout à fait bon d'utiliser $ MyVariable et MyOtherVariable $ dans toute la classe, comme si elles ont été déclarées comme des propriétés de classe.

Alors, question à nouveau: est-ce une fonction PHP ou Prado

Thx

Était-ce utile?

La solution

Ce n'est ni une fonction PHP ni une fonction Prado. Je ne sais pas du Prado, mais PHP n'a pas cette fonctionnalité, donc Prado ne peut pas avoir non plus;)

Ce que vous cherchez cependant, sont des choses comme cela: $this->myUndefinedMember = $something

Votre exemple utilise des variables locales , ces ne peuvent pas et être mis en lecture à partir automagiquement.

invoquera la méthode magique de __set, si elle est définie qui est.

Prado pourrait (je ne sais pas si elle ne) définit cette méthode pour un certain superclasse que vous utilisez habituellement, puis vérifier dynamiquement si une méthode setter a été définie pour ce nom variable.

La signature est comme suit:

public function __set($name, $value)

La méthode Maigc __get($name) fonctionne de façon analogue.

Si vous ne définissez pas comme public, vous ne pourrez utiliser cette propriété comme caractéristique de l'intérieur de la classe (ou sous-classes).

En référence, voir ici sur la fonction ou la surcharge des propriétés et méthodes de PHP5.

Mise à jour

Une mise en œuvre de l'échantillon pourrait ressembler à ceci:

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

Autres conseils

Je réponds très tard à cela, mais je sentais les réponses que pose très déroutant à une fonction simple.

Pour donner une réponse beaucoup plus simple. Toutes les classes Prado héritant de TComponent utiliser les fonctions de __set et __get.

En savoir plus sur les fonctions magiques php

Donc, si u ont une fonction qui commence par « get » ou « set » ils seront appelés lors de l'utilisation du reste du nom de la fonction en tant que champs.

Ceci est le code prado réel pour la __get __set est sur le même

    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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top