这里有两种初始化类变量的方法。
第一种方法
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');
现在,这两种方法都是有效的,但我想知道哪种方法在什么条件下更好?只坚持一种方法有什么优点和缺点?
在您的示例中,第二种方法风险很高。如果您将变量名称作为参数提供,那么您基本上就为代码提供了从类外部设置所有私有变量的访问权限。如果允许像这样自由设置私有变量,那么私有变量还有什么意义呢?
此外,OOP 中封装的要点是类的内部工作对于类外部的代码不透明。第二种方法破坏了这种封装,因此破坏了 OOP 的要点,因为类外部的代码必须了解类的内部工作原理,例如变量的名称。如果您稍后选择更改变量名称会发生什么?所有代码都损坏了。如果通过 setter/getter 访问它们,则可以更改旧函数以反映类内部的更改,但类外部的代码将很难更改。除此之外,第二种方法使值的验证变得困难。
您应该使用第一种方法,特别是如果操作需要设置类变量。但是,如果您认为属性可以允许某些默认值,则可以利用 PHP 的默认参数值,例如:
class Test {
private $var1;
private $var2;
public function Test($var1 = 'defaultValue', $var1 = 'defaultValue') {
$this->var1 = $var1;
$this->var2 = $var2;
}
}
$objTest = new Test();
无论如何,如果这些值必须由代码初始化,那么您绝对应该强制它们在构造函数中传递。如果允许使用默认值,则可以使用变量的单独设置器初始化构造函数中的值,也可以仅使用默认参数值(如提供的示例中所示)。然而,期望代码在调用构造函数后通过 setter 设置关键值是不好的做法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)