Гость_Alan
15.10.2013 - 20:39
Цитата |
> это уже костыль, а не логика. Костыль у вас в голове, а это совершенно нормальная логика. Сделайте в магическом методе проверку наличия метода setFoo() и setBar() и вызывайте их, а они уже сделают все, что нужно.
Во-вторых, вы лезете в область валидации данных класса - это отдельная большая тема, о которой мне с вами не интересно говорить.
В-третьих, вообще попытка взять _пример_, иллюстрирующий один принцип, и пытаться на его основе говорить о чем-то еще - признак обычного тролизма на базе бессилия родить нормальные аргументы для общения. Впрочем, от Guest-а ожидать иного и не следует. |
Мда, ведь я показал, и это везде попадается, пробой лазейка.
Имеем объект и в нём есть приватное свойство clientManager. Так вот, некоторые умники умудрились именно таким образом сменить clientManager несколько раз за жизненый цикл, хотя он должен оставаться один.
И замечу, были createManager и getClientManager, а вот эта лазейка дала возможность свой объект вставлять.
glock18
15.10.2013 - 20:41
Цитата (twin @ 15.10.2013 - 16:35) |
Ты зчем это написал? Ты думаешь я не знаю этого примера из мануала?
Это совершенно другая песня. Это как раз ничего не нарушает. Здесь нет прямого обращения. Если я добавлю в этот класс приватное свойство и попытаюсь к нему обратиться, будет тишина. А должна быть ошибка. |
Ну, если бы знал его, наверно, не задавал бы вопроса "почему мне он ошибку не показывает, когда обращаюсь к закрытому свойству?!!!!". Здесь в частности у класса есть свойство items, и в дальнейшем $obj->items в твоем представлении должен мне ошибку показать. С какого перепуга? А если у меня в классе 100 приватных свойств? Перспектива подбирать незанятые имена, переименовывать поля в базе меня не радует
Гость_Alan
15.10.2013 - 20:43
MiksIr
Цитата |
Сделайте в магическом методе проверку наличия метода setFoo() и setBar() и вызывайте их, а они уже сделают все, что нужно. |
Это костыли, самые что ни на есть.
Смысл мне проверять, если требуется, при чём категорически, отдельный интерфейс. И получается это свойство я должен закрывать от всех, ЗАЧЕМ тогда это.
Я показал как использовать безопасно магию, с помощью приватного массива, тогда и не нужны будут все мансы.
А если я ещё добавлю приватное свойство, то же мне его закрывать? И так до бесконечности.
Это глупо, верх глупости.
Цитата (MiksIr @ 15.10.2013 - 16:37) |
protected $items = array(); ... $obj->items = 'bang';
Так вот же |
Что "вот же"?
Я про это:
class myClass {
protected $items = array();
private $a;
public function __set($name, $value)
{
$this->items[$name] = $value;
}
public function __get($name)
{
return isset($this->items[$name]) ? $this->items[$name] : null;
}
}
$obj = new myClass();
echo $obj->a;
По логике (моей логике, сразу поправлюсь) обращение к приватному свойству должно вызвать ошибку. А оно выдаст NULL. Зачем мне это?
Зчем ваш принцип позволяет думать о плохом, о всяких хаках? Я ваш принцип не отрицаю, почему мой плох, как дополнение?
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
MiksIr
Цитата |
Вот вам, и никакой магии. Тоже мне, нашли крайнего, магия у них виновата. |
Этот пример даёт интерфейс, причём конкретный определённый интерфейс. Его легко найти использование в системе.
Но когда у тебя в системе такая фишка $a->clientManager = $obj;
Да ещё в нескольких местах, да же IDE не может выловить этого.
MiksIr
Цитата |
Но виноват то кто, разработчики языка PHP, которые добавили __get и __set? Или разработчик этого ПО, что набажил такой код? |
Да никто ни виноват. Есть возможность делать, можно. Но знать нужно что есть лазейка к сбою инкапсуляции да же тех свойств которые должны наглухо закрыты.
Гость_Alan
15.10.2013 - 20:53
Дааа, согласен, но мы должны использовать приватный массив что бы обезопасить от такого вот сбоя.
Мы должны работать в ограниченной области массива, а не давать доступ ко всем свойствам класса.
Цитата (MiksIr @ 15.10.2013 - 16:51) |
Цитата | Смысл мне проверять, если требуется, при чём категорически, отдельный интерфейс. И получается это свойство я должен закрывать от всех, ЗАЧЕМ тогда это. |
Интерфейс - это набор открытых сигнатур. Это хорошо, когда он описан явно конструкциями языка. Спорить не буду. Но не обязателен. Он может быть описан и иными средствами. Один из вариантов "зачем" я описывал, но могу и повторить. Итак, есть класс с кучей внешних данных. Ну десятка два входных данных, которые нам нужно установить. Мы можем сделать на каждый сеттер и геттер. Наплодим 40 однотипных методов - не повышает читаемости, правда? Можем все эти свойства просто объявить публичными. Но в этом случае возникает проблема - что делать, если одно из свойств нужно отрефакторить - прилепить проверку или еще что. Вот тут нам может помочь магия. Делаем это свойство приватным - вызывается магия, и там уже делаем что нам нужно.
|
Да, но причем тут магические сеттеры? Есть же более цивилизованные способы. С той же магией.
Вот допустим примерчик. В мануале подобный видел...
Цитата |
Что что? А __set по вашему какой? Приватный, что ли? |
Всё сначала.
Да посмотрите мой пример. Я вообще не хочу никакого сеттера на свйство $a. Не нужен он мне. Я хочу ошибку, что бы не лез никто, кому не повадно. А оно мне NULL выдает. Ну и еще примеры приводили с переопределениями. И что мне теперь, дублировать механизм доступа в магическом сеттере? Это не костыль уже. Это говнокодом попахивает.
Это обращение к свойству, что бы вы про сахар не говорили. Нет никкого сахара в документации.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.
Гость_Alan
15.10.2013 - 21:06
MiksIr
Цитата |
Я в общем никогда не говорил, что магию нужно использовать именно для обращения к приватным свойством - сам это не очень хорошим тоном считаю. |
Но ведь на базе этих примеров и происходит дискуссия.
В результате магия сеттеров даёт пробой в инкапсуляции. Есть лазейка, что я доказывал ранее.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.