PHP / свойство Prado 'обработка' - PullRequest
0 голосов
/ 17 декабря 2010

Я некоторое время изучаю php-фреймворк Prado, и меня интересует одна особенность, будь то из PHP или как-то реализованная в Prado.

А именно, классы, используемые в Prado, могут использовать свойства (поля), которые не объявлены в самом классе, но «определены» методами set и get.

Вот пример:

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

}

Теперь, как-то прекрасно использовать $ MyVariable и $ MyOtherVariable по всему классу, как если бы они были объявлены как свойства класса.

Итак, еще раз вопрос: это функция PHP или Прадо?

Thx

Ответы [ 2 ]

1 голос
/ 18 сентября 2012

Я отвечаю очень поздно, но мне показалось, что ответы очень запутаны простой функцией.

Чтобы дать гораздо более простой ответ.Любые классы Prado, которые наследуются от TComponent, используют функции __set и __get.

Подробнее о магических функциях php здесь

Так что если у вас есть функция, которая начинается с "get" или "set", они будут вызываться при использовании остальныхимя функции в виде полей.

Это фактический код Прадо для __get __set примерно такой же

    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);
    }
}
1 голос
/ 17 декабря 2010

Это не функция PHP и не функция Прадо. Я не знаю Прадо, но в PHP нет такой возможности, поэтому у Прадо тоже не может быть;)

Однако вы ищете такие вещи: $this->myUndefinedMember = $something

В вашем примере используются локальные переменные , эти нельзя устанавливать и считывать автоматически.

Это вызовет магический метод __set, если он определен, то есть.

Прадо мог (я не знаю, так ли это) определять этот метод для определенного суперкласса, который вы обычно используете, и затем динамически проверять, был ли определен метод сеттера для этого имени переменной.

Подпись следующая:

public function __set($name, $value)

Метод maigc __get($name) работает аналогично.

Если вы не установите его как общедоступный, вы сможете использовать эту свойство, похожее на свойство, только внутри класса (или подклассов).

Для справки см. здесь о свойствах и методах PHP5 или о перегрузке.

Обновление

Пример реализации может выглядеть следующим образом:

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