首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP / Prado属性“处理”

PHP / Prado属性“处理”
EN

Stack Overflow用户
提问于 2010-12-17 08:10:43
回答 2查看 160关注 0票数 0

我学习Prado框架已经有一段时间了,我一直想知道一个特性,它是来自php,还是用Prado实现的。

也就是说,Prado中使用的类可以使用属性(字段),这些属性(字段)不是在类本身中声明的,而是由set和get方法“定义”的。

下面是一个例子:

代码语言:javascript
复制
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特性?

Thx

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-17 08:27:44

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

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

您的示例使用局部变量,无法自动设置和读取这些

如果定义的话,这将调用神奇的__set方法。

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

签字情况如下:

代码语言:javascript
复制
public function __set($name, $value)

maigc方法__get($name)类似地工作。

如果不将其设置为public,则只能在类(或子类)中使用类似属性的特性。

作为参考,请参阅关于PHP5 5的特性或重载属性和方法的这里

更新

示例实现可以如下所示:

代码语言:javascript
复制
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
    }
}
票数 1
EN

Stack Overflow用户

发布于 2012-09-18 16:08:43

我对此回答得很晚,但我觉得这些答案给一个简单的特性带来了很大的困惑。

给出一个更简单的答案。从TComponent继承的任何Prado类都使用__set和__get函数。

关于php魔术函数的更多信息这里

因此,如果你有一个以"get“或"set”开头的函数,那么当使用函数名的其余部分作为字段时,它们将被调用。

这是__get的实际普拉多代码-- __set大致相同

代码语言:javascript
复制
    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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4468703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档