15

クラス変数を初期化する2つの方法があります。

第1の方法

class Test {
    private $var1;
    private $var2;

    public function Test($var1,$var1) {
        $this->var1 = $var1;
        $this->var2 = $var2;
    }
}
$objTest = new Test("value1","value2");

2番目の方法

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

さて、これらの両方の方法は有効ですが、どの条件でどちらがより良いか知りたいですか?1つの方法だけに固執することの長所と短所は何ですか?

4

5 に答える 5

13

In your example, the second method is highly risky. If you give the variable name as an argument, you basically give the code the access to set all private variables from outside the class. What is the point of having private variables if you allow them to be set freely like that?

Additionally, the point of encapsulation in OOP, is that the inner workings of a class are not transparent to the code outside the class. Your second method breaks this encapsulation and thus part of the point of OOP, as the code outside the class has to be aware of the inner workings of the class, like the name of the variables. What happens if you later choose to change the variable names? All the code breaks. If they were accessed via setters/getters, old functions could be changed to reflect changes inside the class, but code outside the class would be difficult to change. In addition to that, the second method makes the validation of the values hard.

You should use the first method, especially if setting the class variables is necessary for operation. However, if you feel that some default values can be allowed for the attributes, you can just take advantage of PHP's default argument values like:

class Test {
    private $var1;
    private $var2;

    public function Test($var1 = 'defaultValue', $var1 = 'defaultValue') {
        $this->var1 = $var1;
        $this->var2 = $var2;
    }
}
$objTest = new Test();

Anyway, if the values must be initialized by the code, then you should definitely force them to be passed in the constructor. If default values are allowed, then either initialize the values in constructor with separate setters for the variables or just default argument values like in the provided example. It is, however, bad practice to expect the code to set critical values via setters after the constructor has been called.

于 2011-03-16T07:35:49.793 に答える
1

そもそもなぜ変数をプライベートとして定義したのだろうか。プライベート メンバーは、パブリック インターフェイスを介して使用するためではなく、クラス自体のために存在します。2番目の例のように、プログラム内のいつでもマジックセッターメソッド(__set)が変更できる値を追跡している可能性があります。変数をプライベートにする必要がある場合(クラスのみのアクセス用)、コンストラクター関数 __construct($var1,$var2) または __construct($var1=" defaultvalue ",$var2=" defaultvalue ") を使用して、最初の例。

それは、状態/アクティビティ図で計画した予想される状態によって異なります。

それが役立つことを願っています

于 2011-09-18T05:12:07.967 に答える