Задать вопрос
KAndy
@KAndy

Когда оправдано использование публичных полей в PHP?

Когда оправдано использование публичных полей в PHP?
Вопрос с точки зрения ООП.
  • Вопрос задан
  • 2567 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 6
Тогда же когда и в любом другом языке. Чем php в этом выделяется?

Тогда когда вам необходимо задавать какие-то параметры объекта извне. Или вопрос в том, что можно вместо публичных полей использовать публичные методы вида $myObj->GetName(); $myObj->SetName(«New Name»); или публичные __get и __set? Ну, если никакой немедленной реакции объекта на изменение значения не нужно, почему бы не использовать поля? Простое присваивание или чтение переменной будет быстрее чем вызов метода или темболее использование __get и __set внутри которых все тоже присваивание или чтение переменной.

Или вы вообще от публичных полей предлагаете отказаться? А как объектом то тогда управлять? :)
Ответ написан
@niko83
Существует две школы. Первая из них учит, что в том классе, где определена переменная, обращаться к ней следует свободно (непосредственный доступ). Другая школа утверждает, что даже внутри этого класса следует всегда применять методы доступа (косвенный доступ).

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

Преимущество прямого доступа заключается в лёгкости чтения кода. Не надо останавливаться на мысли «да это просто метод получения значения переменно»

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

Блин, где ж я это прочитал?
Ответ написан
AndrewStephanoff
@AndrewStephanoff
Я использую публичные методы для Entities, т. е. объектов, отражающих сущности системы, например, объект «User»
$user->id = 1;
$user->username = 'user';
$user->firstName = 'First name';
$user->lastName = 'Last name';
Ответ написан
DeusModus
@DeusModus
Под полем вы имеете член класса?
Если да, то ИМХО никогда.
С точки зрения задела на будущее под изменение членов выгоднее определять публичные методы. В таком случае при переходе с двухмерной системы координат на трехмерную не придется переписывать пол приложения(этакий пример в вакууме с public $coordinates=array(array('x'=>1,'y'=>2))).
Ответ написан
apangin
@apangin
Я считаю, что в этом вопросе, как и в любом другом, не нужно прибегать к крайностям, т.е. как нигде не использовать публичные поля, так и использовать их везде — плохо. В частности, неразумно использовать класс с 20-ю приватными полями, для каждого из которых есть методы getX и setX.

Например, в C/C++ есть структуры (struct), а на использовании структур построена большая часть всяких API. И ничего плохого в этом не вижу. В PHP структур нет, но их роль могут играть классы с публичными полями.

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

Еще, например, там, где объект используется для одноразовой передачи блока информации, и последующее изменение полей никак не повлияет на работоспособность системы (скажем, объект $event с полями name, type, sender, message). И т.п.
Ответ написан
Комментировать
akalend
@akalend
программирую
Классическое ООП не рекомендует использование публичных полей. Рекомендуется доступ к данным организовывать через геттеры и сеттеры (это не РНР шные __get & __set, а методы обертки getName(), setName()...).

Можно публичные поля использовать там, где не требуется проверка данных, где используются простые объекты данных. Мы же используем хешмассивы[ $ob = array(); $ob[id]=1;… ] как структуру данных. Можно и даже правильнее вместо них использовать объекты: $ob = new StdClass(); $ob->id = 1; $ob->name=… У нас, в этом случае все поля получаются публичными.

Не целесообразно в данном случае писать специальный класс, и на каждое поле свой геттер и сеттер, если функция данного объекта — это лишь только хранение/передача информации.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы