нигде не нашел информации по угловым скобкам

Danil-n

Новичок
Здравствуйте. Возник вопрос, на который нигде не могу найти ответа. Читаю исходники одного компонента для yii framework, и встречаю такой участок кода
Код:
$uri = array($this->getOwner()->{$this->aliasAttribute});
Что могут означать скобки { } в данном контексте? вот еще пример
Код:
$uri[] = $category->{$this->parentRelation}->{$this->aliasAttribute};
            $category = $category->{$this->parentRelation};
Понятно, что в массив пишется поле класса, в котором находишься, но каким то странным образом. Подскажите пожалуйста.
 

Фанат

oncle terrible
Команда форума
Это фигурные скобки, а не угловые.
позволяют задать имя переменной через другую переменную.
И за такое убивать надо.
 

riff

Новичок
И за такое убивать надо.
Не всегда, конечно )
$a = array('ooo' => 'mmm');
echo $a['ooo'];

$a = (object)$a;
echo $a->{'ooo'};
то же самое, только если имеем дело не с массивом, а с объектом.
(например данные из таблицы получаем не fetch_assoc, а fetch_object)
 
Последнее редактирование:

Redjik

Джедай-мастер
Фанат, я бы тоже не убивал, знаю где это более менее оправдано в yii.
Behavior для модельки, подключается при инициализации и автоматом проставляет update_date, create_date, это часто нужно + у каждого свои заморочки и люди могут по-разному называть эти колонки.

вот и получается

PHP:
class CTimestampBehavior extends CActiveRecordBehavior {

public $createAttribute = 'create_time';
public $updateAttribute = 'update_time';

    public function beforeSave($event) {
        if ($this->getOwner()->getIsNewRecord() && ($this->createAttribute !== null)) {
            $this->getOwner()->{$this->createAttribute} = $this->getTimestampByAttribute($this->createAttribute);
        }
        if ((!$this->getOwner()->getIsNewRecord() || $this->setUpdateOnCreate) && ($this->updateAttribute !== null)) {
            $this->getOwner()->{$this->updateAttribute} = $this->getTimestampByAttribute($this->updateAttribute);
        }
    }

}
это только кусок класса, но думаю логика ясна
 

WMix

герр M:)ller
Партнер клуба
как раз совсем не понятно
$this->getOwner()->{$this->createAttribute} = << это какой аттрибут будет изменен?
если create_time то почемуб так и ненаписать $this->getOwner()->create_time, а если нет ( из расчета что $createAttribute public)?, угадайка!
я не против переменных переменных, но только если все прозрачно

 
Последнее редактирование:

Redjik

Джедай-мастер
$this->getOwner()->{$this->createAttribute} = << это какой аттрибут будет изменен?
если create_time то почемуб так и ненаписать $this->getOwner()->create_time
Дак я же пытаюсь объяснить это, behavior можно определять в любой модели, и в параметрах можно присвоить название атрибута.
Этот behavior идет искаропки в yii. И авторы фв не должны знать как у нас называется конолнка с create_time.
Без расширения класса и изменения мы можем сразу этот behavior использовать.
 

WMix

герр M:)ller
Партнер клуба
те я представляю себе чтото такое
PHP:
$tsBehavior = new CTimestampBehavior;
$tsBehavior->createAttribute = 'adate';
$tsBehavior->attach( new EventManager, 'beforeSave' );
или зачем это все?
 

Redjik

Джедай-мастер
PHP:
class TestModel extends CActiveRecord
{

    public function behaviors()
    {
        return array(
            'CTimestampBehavior' => array(
                'class' => 'zii.behaviors.CTimestampBehavior',
                'createAttribute' => 'create_date',
                'updateAttribute' => 'update_date',
            ),
        );
    }


}
В модельке один раз объявляем, но реализация там похожая, да.
 

WMix

герр M:)ller
Партнер клуба
яб к такому стремился бы
PHP:
class TestModel extends CActiveRecord{
  public function insert( $data ){
    $data->adate = date('Y-m-d'); // createAttribute
    $data->udate = date('Y-m-d');
    parent::insert( $data );
  }
  public function update( $data ){
    $data->udate = date('Y-m-d');
    parent::update( $data );
  }
}
 

Redjik

Джедай-мастер
это понятно, я просто объяснял как это можно применять, я несколько не поддерживаю такой синтаксис, но порой это бывает полезно
все не ограничивается только create_date
можно написать свой behavior, который участвует в куче моделей, потом найти ошибку и поправить ее только в одном месте, нежели проходится по всем моделям
типа дублирование кода, хоть инструмент и сомнительный
 
  • Like
Реакции: AmdY
Сверху