1

我是 Yii 世界中的一个完全的新手,并且尽我所能地学习这个框架,同时阅读关于 Yii 的书 - ' Web Application Development Using Yii and PHP ' by Jeffrey Winesett

我碰到 :

两个特定的公共功能:

public function getTypeOptions(){
        return array(self::TYPE_BUG=>'Bug',self::FEATURE=>'Feature',self::TASK=>'Task');
    }

和 :

public function getTypeText(){
        $typeOptions = $this->typeOptions;
        return isset($typeOptions[$this->type_id]) ? $typeOptions[$this->type_id] : "unknown type ({$this->type_id})";
    }

现在我明白 getTypeOptions 返回 _form.php 文件中 TypeOptions 下拉列表的数组,但是,在另一个函数 getTypeText() 中,在变量: $typeOptions中,我们直接调用这样的函数:

$typeOptions = $this->typeOptions;

没有指定“ getTypeOptions ”的完整函数名

不应该是:

$typeOptions = $this->getTypeOptions();

getTypeOptions()的“ get ”如何;省略?这种方法可以一直应用吗?

是 Yii 特定的还是我不知道的 PHP 的东西?

如果这个问题是一个非常基本的问题,我很抱歉。如果有读过这本书的人回答我,我将非常感激。

4

3 回答 3

2

是的,只要您getAttributeName的模型中有一个方法,您就可以使用它$this->attributeName来返回该方法的值,就好像它是一个属性一样。它被称为“虚拟属性”。这是一个关于它的维基页面:http ://www.yiiframework.com/wiki/167/understanding-virtual-attributes-and-get-set-methods/

你会看到在 Yii 文档和教程中使用了很多。例如,该Yii::app()->getClientScript()方法通常只是使用Yii::app()->clientScript

当您使用 CGridView 时,它也非常方便,因为您可以getAttribute()在模型中定义一个方法,然后添加一个带有名称的 CGridView 列'attribute'来访问它。

由于 CActiveRecord 类中的 PHP getter 魔术方法,您可以这样做。如果您有兴趣,我将在下面粘贴该方法:

/**
     * PHP getter magic method.
     * This method is overridden so that AR attributes can be accessed like properties.
     * @param string $name property name
     * @return mixed property value
     * @see getAttribute
     */
    public function __get($name)
    {
        if(isset($this->_attributes[$name]))
            return $this->_attributes[$name];
        elseif(isset($this->getMetaData()->columns[$name]))
            return null;
        elseif(isset($this->_related[$name]))
            return $this->_related[$name];
        elseif(isset($this->getMetaData()->relations[$name]))
            return $this->getRelated($name);
        else
            return parent::__get($name);
    }

这被称为 getter 魔术方法,当无法找到或访问属性时调用它。您也可以在 Yii 之外使用相同类型的方法:http: //de.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

于 2013-04-22T19:15:40.340 回答
0

这是 PHP 功能;魔术方法

于 2013-04-22T19:14:57.977 回答
0

是的,这是 Yii 特有的。特别是,基类CComponent覆盖了魔术方法 __get__set允许使用以下语法:

属性由 getter 方法和/或 setter 方法定义。可以像访问普通对象成员一样访问属性。读取或写入属性将导致调用相应的 getter 或 setter 方法,例如

$a=$component->text; // equivalent to $a=$component->getText();
$component->text='abc';  // equivalent to $component->setText('abc');

getter 和 setter 方法的签名如下:

// getter, defines a readable property 'text'
public function getText() { ... }
// setter, defines a writable property 'text'
public function setText($value) { ... }

你可以在这里在线浏览实际的实现。

于 2013-04-22T19:16:50.343 回答