Вот два способа инициализации переменных класса.
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');
Теперь эти оба метода действительны, но я хотел бы узнать, какой из них лучше в каких условиях? Какие плюсы и минусы придерживаются только одного метода?
В вашем примере второй метод очень рискован. Если вы укажете имя переменной в качестве аргумента, вы в основном предоставляете коду доступ для установки всех частных переменных вне класса. Какой смысл иметь частные переменные, если вы позволяете им свободно устанавливаться так?
Кроме того, точка инкапсуляции в ООП состоит в том, что внутренняя работа класса непрозрачна для кода вне класса. Второй метод нарушает эту инкапсуляцию и, следовательно, является частью точки ООП, поскольку код вне класса должен знать внутреннюю работу класса, например имя переменных. Что произойдет, если позже вы захотите изменить имена переменных? Весь код ломается. Если бы они были доступны через сеттеры / геттеры, старые функции могли быть изменены, чтобы отражать изменения внутри класса, но код вне класса будет трудно изменить. В дополнение к этому второй метод делает валидацию значений жесткими.
Вы должны использовать первый метод, особенно если настройка переменных класса необходима для работы. Однако, если вы чувствуете, что для атрибутов допустимы некоторые значения по умолчанию, вы можете просто использовать значения аргументов 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
и назовет «верхнюю» конструкцию … и т. Д. …