初始化类变量的更好方法是什么?

Sta*_*arx 13 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");
Run Code Online (Sandbox Code Playgroud)

第二种方法

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');
Run Code Online (Sandbox Code Playgroud)

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

Rii*_*imu 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();
Run Code Online (Sandbox Code Playgroud)

无论如何,如果值必须由代码初始化,那么你一定要强制它们在构造函数中传递.如果允许使用默认值,则使用单独的变量setter初始化构造函数中的值,或者仅使用提供的示例中的默认参数值.然而,在调用构造函数之后,期望代码通过setter设置关键值是不好的做法.


Ikk*_*kke 7

如果这些变量对于类的操作是必需的,那么您将使用第一种方法.这样,您可以确保在创建类时设置它们.

  • 是的,这就是构造函数的用武之地.构造类的对象以便能够做到这一点. (2认同)