В вашем примере второй метод очень рискованный. Если вы дадите имя переменной в качестве аргумента, вы в основном дадите коду доступ для установки всех приватных переменных вне класса. Какой смысл иметь закрытые переменные, если вы позволяете их так свободно устанавливать?
Кроме того, смысл инкапсуляции в ООП заключается в том, что внутренняя работа класса не прозрачна для кода вне класса. Ваш второй метод нарушает эту инкапсуляцию и, таким образом, является частью точки ООП, так как код вне класса должен знать внутреннюю работу класса, например, имя переменных. Что произойдет, если вы позже решите изменить имена переменных? Весь код нарушается. Если бы к ним обращались через установщики / получатели, старые функции можно было бы изменить, чтобы отразить изменения внутри класса, но изменить код вне класса было бы трудно. В дополнение к этому, второй метод затрудняет проверку значений.
Вы должны использовать первый метод, особенно если для работы необходима установка переменных класса. Однако, если вы чувствуете, что некоторые значения по умолчанию могут быть разрешены для атрибутов, вы можете просто воспользоваться значениями аргументов по умолчанию PHP, такими как:
class Test {
private $var1;
private $var2;
public function Test($var1 = 'defaultValue', $var1 = 'defaultValue') {
$this->var1 = $var1;
$this->var2 = $var2;
}
}
$objTest = new Test();
В любом случае, если значения должны быть инициализированы кодом, то вы обязательно должны принудительно передать их в конструктор. Если значения по умолчанию разрешены, то либо инициализируйте значения в конструкторе с отдельными установщиками для переменных, либо просто значения аргументов по умолчанию, как в представленном примере. Однако плохая практика - ожидать от кода установки критических значений через сеттеры после вызова конструктора.