Сеттеры в PHP

fixxxer

К.О.
Партнер клуба
В случае, если объект - не некий ArrayObject (или делегирующий ему), для начала надо подумать, какого хрена мы пишем $Object->setName() или $Object->getName(). Этого быть вообще не должно, должно быть $this->name.

Теме сто лет в обед:
http://demiurg.livejournal.com/60458.html?thread=735786#t735786

там Crazy все правильно говорит, но, кажется, его никто не понимает. (Признаться, тогда, в 2005-м, я тоже не понял).
 

Absinthe

жожо
Одинокая $homepage_url выбивается своим подчеркнутым названием :D

Очень важный момент упущен:
В описании класса должны стоять @property описания для заранее известных переменных, чтобы с ними адекватно работали IDE.
 
  • Like
Реакции: AmdY

fixxxer

К.О.
Партнер клуба
В описании класса должны стоять @property описания для заранее известных переменных, чтобы с ними адекватно работали IDE.
Чего только не придумают вместо нормального проектирования. :) Публикация свойств с заранее известными именами - это в нормальном объектном дизайне очень редкая вещь: фактически это нарушение инкапсуляции. Во всех уместных случаях будет __set magic и ничего заранее не опишешь.
 
  • Like
Реакции: Dovg

Absinthe

жожо
fixxxer
порой нужно для заранее определенного и закрытого набора свойств с одинаковым поведением.

Хотя я геттеры/сеттеры вручную прописываю в таком случае без всяких магий.
 

AmdY

Пью пиво
Команда форума
Absinthe
прописывать геттеры-сеттеры вручную нужно лишь для нестандартного поведения, чтобы перекрывать магические методы
 

Redjik

Джедай-мастер
Василий М.
хорошая статья, а не хочешь расширить и примеси добавить к магии в статье?

ЗЫ. @property - инфа 100% =)
 

Redjik

Джедай-мастер
Чего только не придумают вместо нормального проектирования. :) Публикация свойств с заранее известными именами - это в нормальном объектном дизайне очень редкая вещь: фактически это нарушение инкапсуляции. Во всех уместных случаях будет __set magic и ничего заранее не опишешь.
модель в AR ?
 

Василий М.

Новичок
Василий М.
хорошая статья, а не хочешь расширить и примеси добавить к магии в статье?

ЗЫ. @property - инфа 100% =)
Спасибо. Примеси.. это что? Трейты?

Публикация свойств с заранее известными именами - это в нормальном объектном дизайне очень редкая вещь: фактически это нарушение инкапсуляции.
поясни. о чем ты?
 

Redjik

Джедай-мастер
Василий М.
примеси - mixin, как раз через магию делают, хотя с трейтами по-тихоньку теряет актуальность.
 

fixxxer

К.О.
Партнер клуба
Мне вообще кажется, что AR, у которого все свойства напрямую торчат наружу, это антипаттерн, но я еще не определился. Чтобы определиться, надо придумать что-то более изящное. :)
 

AmdY

Пью пиво
Команда форума
fixxxer
они же не напряму, а через магические методы и можно оверврайтить поведение.
function __get($key) {
if (!method_exists($this, "get{$key}") && ....) {
return $this->{$key};
} else {
return $this->"get{$name}()";
}
 

fixxxer

К.О.
Партнер клуба
AmdY
Само собой. Проблема в том, что это приведет (и приводит!) к коду в пейдж контроллере вида
$Model->title = $Request->title;
$Model->name = $Request->name;
/// еще стопицот строк

Например, все начинающие РоРовцы так делают, пока кто-то не стукнет по рукам и не скажет про update_attributes.

Вопрос, нужно ли нам вообще вне модели знать, какие поля у нее есть? Я склоняюсь к тому, что нет:

PHP:
$Model = (new Model_User)->loadById($this->userId);
$Form = (new Form)->fillFromModel($Model);
if ($this->Request->isPost()) {
    $Model->fetchAttributesFrom($Form)->save();
    return $this->Response->redirectToPage($this);
}
$this->View->assign('Form', $Form);
 

Василий М.

Новичок
Я склоняюсь к тому, что нет:
тогда это не модель, а мусорка, типа array
у нас на работе так делают - наполняет звездные классы как из клиентского кода, так и из методов класса.
в итоге хз какие свойства у объекта есть, каких нет и откуда они там появляются - никто не скажет
 

fixxxer

К.О.
Партнер клуба
Василий М.
Нее. Ты не понял. Модель-то сама прекрасно знает, какие у нее атрибуты, и как их валидировать/фильтровать. Просто засунуть что-то не получится, что она не знает, то не возьмет.
 

AmdY

Пью пиво
Команда форума
угу, но в твоём примере самое главное, чтобы форма возвращала только разрешённые поля, а не все что подсунули в пост. те же роровцы на этом обожглись, вроде так ломали даже гитхаб.

Вот только я не понял, а как связаны магические методы и знание об полях. Плюс магических методов как раз в том, что можно засунуть какие угодно поля, а уже на sql запросе вывалится ошибка какого поля нет.

Судя по всему я тебя недопонял.
 
Сверху