2013-04-22 3 views
1

Я полный новичок в мире Yii и прилагаю все усилия, чтобы изучить структуру, насколько это возможно, при чтении книги по Yii - 'Разработка веб-приложений с использованием Yii и PHP' by Джеффри Winesett,Yii getTypeText()

я наткнулся:

Два конкретных общественных функций:

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 возвращает массив для выпадающего списка для TypeOptions в файле _form.php, однако, в другой функции getTypeText() в переменной: $ typeOptions, мы непосредственно вызова функции вроде этого:

$typeOptions = $this->typeOptions; 

без указания полного имени функции «getTypeOptions»

я не должен т были:

$typeOptions = $this->getTypeOptions(); 

Как это "получить" из getTypeOptions(); ommitted? Может ли этот метод применяться всегда?

Является ли это Yii специфическим или что-то вроде PHP, о котором я не знаю?

Прошу прощения, если вопрос очень простой. Я был бы очень признателен, если бы тот, кто прочитал книгу, ответил мне.

+0

$ this-> typeOptions ссылается на общедоступную переменную $ typeOptions. Если вы посмотрите в файл, вверху, вы увидите строку «public $ typeOptions». Это не относится к функции getTypeOptions(). –

+0

Нет, в моем коде нет общедоступных $ typeOptions. Единственная переменная типаOption - та, которую я описал выше. –

ответ

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' для доступа к нему.

Вы можете сделать это из-за метода PHP getter magic в классе CActiveRecord. Я вставить этот метод ниже, если вы заинтересованы:

/** 
    * 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); 
    } 

Это известно как магический метод получения и он вызывается, когда атрибут не может быть найден или доступ. Вы можете использовать этот метод такого же типа вне Yii: http://de.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members

+0

Большое вам спасибо за чудесное понимание! :) Я действительно многому научился. !! –

0

Да, это что-то особенное для Yii.В частности, базовый класс CComponent перекрывает magic methods__get и __set, чтобы этот синтаксис:

Свойство определяется методом газопоглощающего, и/или метод установки. Доступ к объектам свойств можно получить так, как доступ к объекту нормального объекта . Чтение или запись свойства вызовет вызов соответствующих геттерный или сеттер метода, например

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

Подписи добытчика и присваивателей являются следующим:

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

Вы можете просмотреть фактическая реализация онлайн here.

Смежные вопросы