При определении класса PHP, который является предпочтительным / лучшей практикой? Есть ли какие-то ключевые различия, которые я пропускаю?
Похоже, что может быть более чистым, лаконичным и удобным написать магический метод __set()
и поместить в него конструкцию switch()
с случаями для всех частных членов, к которым я хочу разрешить доступ. Это не было бы setFoo()
внутри класса, но тогда и не было бы setFoo()
, поэтому, если я хочу использовать внутреннее setFoo()
доступа / мутатора, я должен был бы явно вызвать метод в любом случае.
Другое отличие состоит в том, что в коде вне класса я всегда мог обращаться к членам-членам таким же образом, как и $obj->foo
, будь то public (напрямую) или private (с использованием __set()
), а также с использованием многих отдельных методов.
Я предполагаю, что это сводится в основном к эстетическому выбору. Например, если у меня есть адресные данные о покупке, я не хочу иметь 16 или более отдельных методов доступа только для имени, фамилии, адреса1, адреса2, города, штата и т. Д. Для отправки и выставления счетов.
Есть ли какие-то ключевые различия, которые я забыл? (Может ли сложная IDE отказаться от автоматического заполнения имени участника за пределами класса, потому что она помечена как конфиденциальная?) Действительно ли я ответил на свой собственный оригинальный вопрос? Спасибо заранее за ваш вклад.
Пойдите с индивидуальными аксессуарами для каждого члена, которого вы хотите получить извне. Я попробовал оба и нашел эти причины для использования аксессуаров:
$numbers = &$object->getNumbers(); $numbers[] = 4;
при работе с массивами, то есть $numbers = &$object->getNumbers(); $numbers[] = 4;
– без ссылки, вам нужно будет снова вызвать setter.) Самое большое различие, которое я вижу в phpdoc:
__set
, вы не сможете генерировать phpdoc для каждого доступа @property
может помочь, однако, на этом этапе) . Personnaly, я бы пошел с определением аксессоров самостоятельно, даже если это означает писать немного больше кода:
__set
. Кроме того, я бы использовал эти методы доступа при настройке свойств внутри класса: это означает немного больше кода, да, но это также означает переход через определенный код (например, код для проверки некоторых вещей), которые они содержат.
Наконец, если вы просто используете некоторые свойства для хранения данных и не должны определять какое-либо конкретное поведение, почему бы не публиковать их как общедоступные и разрешить пользователям напрямую обращаться к ним?