我正在学习Prado PHP框架已有一段时间了,我一直想知道一项功能是否来自PHP或Prado中以某种方式实施。

也就是说,Prado中使用的类可以利用类本身中未声明的属性(字段),而是通过设置和获取方法“定义”。

这是一个例子:

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还是Prado功能?

谢谢

有帮助吗?

解决方案

这既不是PHP功能也不是Prado功能。我不知道Prado,但是PHP没有这样的功能,因此Prado也不能拥有;)

但是,您要寻找的是这样的东西: $this->myUndefinedMember = $something

您的示例使用 本地变量, , 这些 不能 设置并自动读取。

这会唤起魔术 __set 方法,如果是定义的。

Prado可以(我不知道它是否确实如此)为您通常使用的某个超级阶级定义了此方法,然后动态检查是否已为该变量名称定义了一个设置器方法。

签名如下:

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

其他提示

我对此很晚回答,但我感到答案对一个简单的功能感到非常困惑。

给出更简单的答案。从tcomponent继承的任何PRADO类都使用__SET和__GET函数。

有关PHP魔术功能的更多信息 这里

因此,如果您具有以“ get”或“ set”开头的函数,则在使用其余函数名称作为字段时将被调用。

这是__get的实际prado代码__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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top