繁体   English   中英

PHP / Prado属性“处理”

[英]PHP / Prado property 'treatment'

我现在正在学习Prado php框架一段时间了,我一直想知道一个功能,如果它来自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还是Prado功能?

谢谢

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

给出一个简单得多的答案。 从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);
    }
}

这既不是PHP功能也不是Prado功能。 我不知道普拉多,但PHP没有这样的功能,所以普拉多也不能拥有它;)

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

您的示例使用局部变量 ,这些变量 不能被自动设置和读取。

如果已定义,它将调用魔术__set方法。

Prado可以(我不知道它是否确实如此)为您经常使用的某个超类定义此方法,然后动态检查是否已为该变量名定义了setter方法。

签名如下:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM