Intereting Posts
Редактировать сеанс других пользователей в PHP Как экспортировать строку Base64 в файл на стороне сервера, не сохраняя его на веб-сервере, напрямую с помощью PHP? изменение ключей массива в функции array_walk? Теги PHPExcel Render html в строке таблицы mysql Symfony 1.4: PHP Неустранимая ошибка: допустимый размер памяти 33554432 байт исчерпан PHP Phpmyadmin не выполняется, но работают другие скрипты php Сделать запрос HTTPS через PHP и получить ответ Лучший способ заполнить поле <SELECT> с помощью часовых поясов Именованные обратные ссылки с preg_replace PDO не возвращает результатов, тогда как командная строка MySQL возвращает ожидаемый результат как я могу получить многомерные значения массива, используя foreach? Необходимо загрузить файлы в документы Google из моего приложения и сохранить ссылку на загруженный файл Отправка больших пакетов с использованием php с помощью socket_write Передача массива requestAction в CakePHP UTF-8 полностью через

Каков наилучший подход к инициализации переменных класса?

Вот два способа инициализации переменных класса.

1-й метод

class Test { private $var1; private $var2; public function Test($var1,$var1) { $this->var1 = $var1; $this->var2 = $var2; } } $objTest = new Test("value1","value2"); 

Второй метод

 class Test { private $var1; private $var2; public function _set($var, $value) { $this->$$var = $value } } $objTest = new Test(); $objTest->_set('var1','value1'); $objTest->_set('var2','value2'); 

Теперь эти оба метода действительны, но я хотел бы узнать, какой из них лучше в каких условиях? Какие плюсы и минусы придерживаются только одного метода?

Solutions Collecting From Web of "Каков наилучший подход к инициализации переменных класса?"

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

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

Вы должны использовать первый метод, особенно если настройка переменных класса необходима для работы. Однако, если вы чувствуете, что для атрибутов допустимы некоторые значения по умолчанию, вы можете просто использовать значения аргументов PHP по умолчанию, например:

 class Test { private $var1; private $var2; public function Test($var1 = 'defaultValue', $var1 = 'defaultValue') { $this->var1 = $var1; $this->var2 = $var2; } } $objTest = new Test(); 

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

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

Интересно, почему вы определили свои переменные как частные в первую очередь. Частные члены существуют для самого класса, а не для использования через открытый интерфейс. Он может отслеживать какую-то ценность, которую может изменить метод магического сеттера (__set) в любое время в программе, как вы это делаете в своем втором примере. Если вам нужно, чтобы ваши переменные были приватными (для доступа только к классу), то функция-конструктор __construct ($ var1, $ var2) или __construct ($ var1 = " defaultvalue ", $ var2 = " defaultvalue "), поэтому в соответствии с вашим первым пример.

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

надеюсь, это поможет

Как насчет этого

 class A{ public $x; public $y; function A($var1=10,$var2=15){ //the default value for the class $this->x=$var1; $this->y=$var2; } } $object_of_A= new A(20,30); //if you do not want to change the default value then //pass no arguments 

Я считаю, что вы должны комбинировать оба метода.

Незаменимые свойства должны присутствовать в методе построения.

Для свойств, которые являются необязательными, вы должны определить значение по умолчанию в конструкции, а затем создать getter / setter.

И вы можете создавать несколько методов построения, например, для базы данных, в общем, у вас есть:

 myConstructor($dsn) myConstructor($dsn, $username, $password) myConstructor($dsn, $username, $password, $port) myConstructor($dsn, $username, $password, $port, $options) 

Затем в «нижней» конструкции вы установите $options затем вызовите «верхнюю» конструкцию, которая установит $port и назовет «верхнюю» конструкцию … и т. Д. …