Эта тема на forum.dklab.ru


RomanK: Открытые свойства класса
В книге Д. Котерова написано:
Старайтесь не создавать открытые свойства вообще. Делайте их закрытыми (private) или, в крайнем случае, - защищенными (protected). Доступ к свойству лучше организовать при помощи открытых методов.
Можно спросить, ПОЧЕМУ???
ToxaP:
Как я думаю это нужно делать для защиты, что бы ничего не смогло изменить в твоём классе свойства!
И как я считаю, может я, и ошибаюсь, это правильный тон программирования!
WingedFox:
Идея такова - в свойствах класса должны храниться только гарантированно валидные данные.
Если свойство публичное - никто не может поручиться за чистоту контента.

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

Открытые методы для установки защищённых свойств как раз и используются в качестве таких фильтров.
chin:
Во!
RomanK:
WingedFox, а если, например, свойство может преобретать значение только true или false, зачем мне писать целую функцию для того, чтобы тот, кто будет использовать мой класс, по ошибке не присвоил ему какое-нибудь значение отличное от true или false???

А хотя суть я уже начинаю улавливать. :)
WingedFox:
зачем мне писать целую функцию
А затем, что другие свойства могут быть завязаны именно на это значение.
И произвольное его изменение может вызвать очень сложно отлавливаемые ошибки.

Функция же может проверять зависимые свойства и, например, запрещать изменение данного.
amikhailov:
а если, например, свойство может преобретать значение только true или false, зачем мне писать целую функцию для того, чтобы тот, кто будет использовать мой класс, по ошибке не присвоил ему какое-нибудь значение отличное от true или false???
Потому что в PHP переменные не имеют четко установленного типа, как, например, в Java.

Предположим, у вас в классе есть свойство $class->a, которое активно используется в проекте из 10000 строк кода. Пусть это свойство будет адресом электронной почты. Теперь руководитель сказал, что этот адрес в любом случае должен быть валидным (то есть вида user@host.ru). Если в проекте это свойство устанавливалось напрямую ($class->a = что-то), то нет никакой гарантии, что все адреса валидные, значит надо во всем проекте сделать провевку на валидность перед присваиванием значения свойству $class->a. А если сразу использовать публичный метод (допустим, $class->SetA (что-то) ), то можно прямо в этом методе прописать проверку на валидность, а не ползать по 10000 строкам кода, везде ставя проверку на валидность.
RomanK:
amikhailov, ну я понял. Спасибо всем. Так и буду делать.

Эта тема на forum.dklab.ru