Сеттеры/геттеры, видимость [ООП] в PHP
-
18-09-2019 - |
Вопрос
Я нахожусь в процессе переформатирования своего класса (см. ниже). Я думаю, что допустил ошибку, установив все с одинаковой видимостью в моем классе, тогда как свойства действительно должны быть частными, а геттеры/сеттеры в большинстве случаев должны быть общедоступными.
Чтобы получить свойство, я просто выполняю $path->propertyname, но заметил, что более практично иметь сеттеры/геттеры.Если бы мне пришлось реализовать геттеры, следует ли мне создавать по одному для каждого свойства или можно сделать по одному для всего класса?Например, я хочу получить имя контроллера...
public function getController( ) {
return $this->controller;
}
И что бы вернуть контроллеру частную собственность?Часто ли используется более общий метод получения/установки или даже гибридный метод, который получает и наборы для меня?
Вот структура класса (только свойства/методы):
class urlParser {
public static $url = '';
public static $controller = '';
public static $baseController = '';
public static $urls = '';
public static $template = '';
public static $captures = '';
public static $contentXML = '';
function __construct( $urls ) {
$this->urls = $urls;
$this->baseController = $urls['default'];
$this->get_url();
}
public function get_url() {
// sets following properties:
// url, template, controller, contentXML, baseController
}
}
Решение
Наличие сеттеров и геттеров в вашем случае бессмысленно.
Если вам нужно сделать что-либо, кроме возврата контроллера, вам не нужен геттер, так как вам не нужен сеттер, если вы ничего не делаете со свойством после его установки.
Если вам действительно нужны геттеры и сеттеры, вы можете использовать магические методы __get и __set для всех ваших свойств.Но это совершенно бессмысленно, если дело обстоит так, как я описал выше.
Другие советы
взгляните на перегрузку в php: http://php.net/overload
есть два волшебных метода __get()
и __set()
который может сделать именно то, что вы хотите
PHP-объекты имеют некоторые приятные магические методы (хотя я не использую их все, потому что это может сбить с толку).Возможно, вы ищете __получать() и __набор().Вам все равно придется реорганизовать весь свой код, если вы решите сделать свои поля данных закрытыми (что вам следует сделать, чтобы у вас не было неправильного доступа к другим полям кода).Такой подход поможет сделать ваш код немного лучше и проще в сопровождении.
Хотя я обычно стараюсь иметь геттеры и сеттеры для каждого поля частных данных, потому что вы можете легко увидеть любую проверку для каждого поля.Плюс я больше разработчик Java, чем разработчик PHP.