这里有两种初始化类变量的方法。
第一种方法
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');
现在,这两种方法都有效,但我想知道哪种方法在什么条件下更好?只坚持一种方法的优缺点是什么?
最佳答案
在您的示例中,第二种方法风险很高。如果将变量名作为参数提供,基本上就是为代码提供了从类外部设置所有私有(private)变量的权限。如果允许像那样自由设置私有(private)变量,那么拥有私有(private)变量有什么意义?
此外,OOP 中的封装点是类的内部工作对类外部的代码不透明。你的第二个方法打破了这种封装,因此打破了 OOP 的一部分,因为类外部的代码必须知道类的内部工作,比如变量的名称。如果您稍后选择更改变量名称会怎样?所有的代码都中断了。如果通过 setter/getter 访问它们,则可以更改旧函数以反射(reflect)类内部的更改,但类外部的代码将很难更改。除此之外,第二种方法使值的验证变得困难。
您应该使用第一种方法,尤其是在操作需要设置类变量时。但是,如果您觉得属性可以允许一些默认值,您可以利用 PHP 的默认参数值,例如:
class Test {
private $var1;
private $var2;
public function Test($var1 = 'defaultValue', $var1 = 'defaultValue') {
$this->var1 = $var1;
$this->var2 = $var2;
}
}
$objTest = new Test();
无论如何,如果值必须由代码初始化,那么您绝对应该强制在构造函数中传递它们。如果允许默认值,则要么使用变量的单独 setter 初始化构造函数中的值,要么像提供的示例中那样仅使用默认参数值。但是,期望代码在调用构造函数后通过 setter 设置临界值是不好的做法。
关于php - 哪种初始化 php 属性的方法更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5322123/