15

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

第一种方法

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

现在,这两种方法都是有效的,但我想知道哪种方法在什么条件下更好?只坚持一种方法有什么好处和坏处?

4

5 回答 5

13

在您的示例中,第二种方法风险很大。如果您将变量名称作为参数提供,则基本上可以让代码访问从类外部设置所有私有变量。如果您允许像那样自由设置私有变量,那么拥有私有变量有什么意义?

此外,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 设置临界值是不好的做法。

于 2011-03-16T07:35:49.793 回答
8

如果这些变量对于类的运行是必需的,你最好使用第一种方法。这样,您可以确保在创建类时设置它们。

于 2011-03-16T07:25:26.300 回答
1

我想知道您为什么首先将变量定义为私有的。私有成员存在于类本身,而不是通过公共接口使用。它可能会在程序中随时跟踪某个值,魔法设置器方法 (__set) 可以更改该值,就像您在第二个示例中所做的那样。如果您需要您的变量是私有的(仅用于类访问),那么构造函数 __construct($var1,$var2) 或 __construct($var1=" defaultvalue ",$var2=" defaultvalue "),因此与您的第一个保持一致例子。

这取决于您在状态/活动图中计划的预期状态。

希望有帮助

于 2011-09-18T05:12:07.967 回答
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
于 2011-03-16T07:38:13.040 回答
-1

我的想法是你应该结合这两种方法。

不可避免的属性必须存在于构造方法中。

对于可选的属性,您应该在构造中定义默认值,然后创建 getter/setter。

您可以创建多种构造方法,例如数据库,通常,您有:

myConstructor($dsn)
myConstructor($dsn, $username, $password)
myConstructor($dsn, $username, $password, $port)
myConstructor($dsn, $username, $password, $port, $options)

然后在“底部”构造中,您将设置$options然后调用“上部”构造,该构造将设置$port并调用“上部”构造......等等......

于 2011-03-16T07:25:44.887 回答