哪个是初始化php属性的更好方法?

时间:2011-03-16 07:18:27

标签: php class variable-initialization

这是初始化类变量的两种方法。

第一种方法

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');

现在,这两种方法都是有效的,但我想知道哪种方法更好?只坚持一种方法的利弊是什么?

5 个答案:

答案 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的“上部”构造,并将调用“上部”构造...等...