[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Магия и инкапсуляция
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Гость_Alan
Цитата
> это уже костыль, а не логика.
Костыль у вас в голове, а это совершенно нормальная логика. Сделайте в магическом методе проверку наличия метода setFoo() и setBar() и вызывайте их, а они уже сделают все, что нужно.

Во-вторых, вы лезете в область валидации данных класса - это отдельная большая тема, о которой мне с вами не интересно говорить.

В-третьих, вообще попытка взять _пример_, иллюстрирующий один принцип, и пытаться на его основе говорить о чем-то еще - признак обычного тролизма на базе бессилия родить нормальные аргументы для общения. Впрочем, от Guest-а ожидать иного и не следует.


Мда, ведь я показал, и это везде попадается, пробой лазейка.
Имеем объект и в нём есть приватное свойство clientManager. Так вот, некоторые умники умудрились именно таким образом сменить clientManager несколько раз за жизненый цикл, хотя он должен оставаться один.
И замечу, были createManager и getClientManager, а вот эта лазейка дала возможность свой объект вставлять.
glock18
Цитата (twin @ 15.10.2013 - 16:35)
Ты зчем это написал? Ты думаешь я не знаю этого примера из мануала?

Это совершенно другая песня. Это как раз ничего не нарушает. Здесь нет прямого обращения. Если я добавлю в этот класс приватное свойство и попытаюсь к нему обратиться, будет тишина. А должна быть ошибка.


Ну, если бы знал его, наверно, не задавал бы вопроса "почему мне он ошибку не показывает, когда обращаюсь к закрытому свойству?!!!!". Здесь в частности у класса есть свойство items, и в дальнейшем $obj->items в твоем представлении должен мне ошибку показать. С какого перепуга? А если у меня в классе 100 приватных свойств? Перспектива подбирать незанятые имена, переименовывать поля в базе меня не радует biggrin.gif
Гость_Alan
MiksIr
Цитата
Сделайте в магическом методе проверку наличия метода setFoo() и setBar() и вызывайте их, а они уже сделают все, что нужно.


Это костыли, самые что ни на есть.
Смысл мне проверять, если требуется, при чём категорически, отдельный интерфейс. И получается это свойство я должен закрывать от всех, ЗАЧЕМ тогда это.
Я показал как использовать безопасно магию, с помощью приватного массива, тогда и не нужны будут все мансы.
А если я ещё добавлю приватное свойство, то же мне его закрывать? И так до бесконечности.
Это глупо, верх глупости.
twin
Цитата (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. Зачем мне это?

Зчем ваш принцип позволяет думать о плохом, о всяких хаках? Я ваш принцип не отрицаю, почему мой плох, как дополнение?

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Guest
MiksIr
Цитата
Вот вам, и никакой магии. Тоже мне, нашли крайнего, магия у них виновата.


Этот пример даёт интерфейс, причём конкретный определённый интерфейс. Его легко найти использование в системе.
Но когда у тебя в системе такая фишка $a->clientManager = $obj;
Да ещё в нескольких местах, да же IDE не может выловить этого.
Guest
MiksIr
Цитата
Но виноват то кто, разработчики языка PHP, которые добавили __get и __set? Или разработчик этого ПО, что набажил такой код?


Да никто ни виноват. Есть возможность делать, можно. Но знать нужно что есть лазейка к сбою инкапсуляции да же тех свойств которые должны наглухо закрыты.
Гость_Alan
Дааа, согласен, но мы должны использовать приватный массив что бы обезопасить от такого вот сбоя.
Guest
Мы должны работать в ограниченной области массива, а не давать доступ ко всем свойствам класса.
twin
Цитата (MiksIr @ 15.10.2013 - 16:51)
Цитата
Смысл мне проверять, если требуется, при чём категорически, отдельный интерфейс. И получается это свойство я должен закрывать от всех, ЗАЧЕМ тогда это.

Интерфейс - это набор открытых сигнатур. Это хорошо, когда он описан явно конструкциями языка. Спорить не буду. Но не обязателен. Он может быть описан и иными средствами.
Один из вариантов "зачем" я описывал, но могу и повторить.
Итак, есть класс с кучей внешних данных. Ну десятка два входных данных, которые нам нужно установить.
Мы можем сделать на каждый сеттер и геттер. Наплодим 40 однотипных методов - не повышает читаемости, правда?
Можем все эти свойства просто объявить публичными. Но в этом случае возникает проблема - что делать, если одно из свойств нужно отрефакторить - прилепить проверку или еще что. Вот тут нам может помочь магия. Делаем это свойство приватным - вызывается магия, и там уже делаем что нам нужно.

Да, но причем тут магические сеттеры? Есть же более цивилизованные способы. С той же магией. Вот допустим примерчик. В мануале подобный видел...
Цитата
Что что? А __set по вашему какой? Приватный, что ли?
Всё сначала.

Да посмотрите мой пример. Я вообще не хочу никакого сеттера на свйство $a. Не нужен он мне. Я хочу ошибку, что бы не лез никто, кому не повадно. А оно мне NULL выдает. Ну и еще примеры приводили с переопределениями. И что мне теперь, дублировать механизм доступа в магическом сеттере? Это не костыль уже. Это говнокодом попахивает.

Это обращение к свойству, что бы вы про сахар не говорили. Нет никкого сахара в документации.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Гость_Alan
MiksIr
Цитата
Я в общем никогда не говорил, что магию нужно использовать именно для обращения к приватным свойством - сам это не очень хорошим тоном считаю.


smile.gif Но ведь на базе этих примеров и происходит дискуссия.
В результате магия сеттеров даёт пробой в инкапсуляции. Есть лазейка, что я доказывал ранее.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.