这是初始化类变量的两种方法。
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');
现在,这两种方法都是有效的,但我想知道哪种方法更好?只坚持一种方法的利弊是什么?
答案 0 :(得分:13)
在您的示例中,第二种方法风险很大。如果将变量名称作为参数,则基本上为代码提供了从类外部设置所有私有变量的访问权限。私有变量有什么意义,如果允许它们像这样自由设置?
此外,OOP中的封装点是类的内部工作方式对类外的代码不透明。你的第二种方法打破了这种封装,从而破坏了OOP的一部分,因为类外的代码必须知道类的内部工作方式,比如变量的名称。如果您以后选择更改变量名称会发生什么?所有代码都中断了。如果通过setter / getters访问它们,可以更改旧函数以反映类中的更改,但类之外的代码将难以更改。除此之外,第二种方法使得值的验证变得困难。
您应该使用第一种方法,特别是如果设置类变量是操作所必需的。但是,如果您认为属性可以允许某些默认值,则可以利用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设置关键值是不好的做法。
答案 1 :(得分:7)
如果这些变量对于类的操作是必需的,那么您将使用第一种方法。这样,您可以确保在创建类时设置它们。
答案 2 :(得分:1)
我想知道为什么你首先将变量定义为私有。私有成员存在于类本身,而不是通过公共接口使用。它可能会跟踪某个值,这是一个神奇的setter方法(__set)可以在程序中随时更改,就像在第二个示例中一样。如果您需要将变量设置为私有(仅限类访问),则构造函数__construct($ var1,$ var2)或__construct($ var1 =“ defaultvalue ”,$ var2 =“ defaultvalue “),所以与你的第一个例子保持一致。
这取决于您在州/活动图中计划的预期状态。
希望有所帮助
答案 3 :(得分:0)
这个怎么样?
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
答案 4 :(得分:-1)
我的想法是你应该结合两种方法。
不可避免的属性必须存在于构造方法中。
对于可选属性,您应该在构造中定义默认值,然后创建getter / setter。
您可以创建多个构造方法,例如数据库,通常,您有:
myConstructor($dsn)
myConstructor($dsn, $username, $password)
myConstructor($dsn, $username, $password, $port)
myConstructor($dsn, $username, $password, $port, $options)
然后在“底部”构造中,您将设置$options
,然后调用将设置$port
的“上部”构造,并将调用“上部”构造...等...