1

次のコードを検討してください。

class Manager{
  function a(){
    $var1 = 10;
    $var2 = 20;
    var_dump($var1 * $var2);
    echo "<br> var1=" . $var1 . "<br>";
    echo "var2=" . $var2;
  }
}

class Sub extends Manager{
  function a(){
    $var1 = 20;
    parent::a();
  }
}
$s = new Sub();
$s->a();

$var1ここでは、 fromの値をオーバーライドしSub::a()て親関数を呼び出し、Manager::a()php が結果を(20 x 20)として設定$var1=20および表示することを期待しています。400しかし、うまくいかないようです。$var1はまだ に等しい10です。

関数のローカル変数をオーバーライドできる php の関数を部分的にオーバーライドする方法があるかどうか疑問に思っていますか? 400具体的には、このコードでは、現在のではなく、どうすれば抜け出すことができ200ますか?

[編集]

これSubは単なる例です。 、などSub1の複数の子クラスがあります。したがって、各サブクラスは、次のように に異なる値を設定しようとします。Sub2Sub3$value1

class Sub1 extends Manager{
      function a(){
        $var1 = 20;
        parent::a();
      }
    }

class Sub2 extends Manager{
      function a(){
        $var1 = 99;
        parent::a();
      }
    }
class Sub3 extends Manager{
      function a(){
        $var1 = 50;
        parent::a();
      }
    }
4

2 に答える 2

3

クラス メソッド内の変数のスコープは常にローカルです。親メソッドを上書きまたは呼び出しても何も変わりません。

値を動的に割り当ててそれに応じて変更する必要がある場合は、クラス プロパティを使用することをお勧めします。

例えば。

class Manager {

    protected $_var1;
    protected $_var2;

    function a() {
        $this->_var1 = 10;
        $this->_var2 = 20;
        var_dump($this->_var1 * $this->_var2);
        echo "<br> var1=" . $this->_var2 . "<br>";
        echo "var2=" . $this->_var2;
    }
}

class Sub extends Manager {
    function a() {
        $this->_var1 = 20;
        parent::a();
    }
}

$s = new Sub();
$s->a();

これにより、値が上書きされ、期待どおりに機能します。

お役に立てれば。

于 2013-06-16T13:59:40.463 に答える
3

いいえ。デフォルトの関数パラメーターを設定できますが、呼び出す関数のローカル値をオーバーライドすることはできません。

class Manager{
  function a($var1 = 10, $var2 = 20){ // default value of $var1: 10; of $var2: 20
    var_dump($var1 * $var2);
    echo "<br> var1=" . $var1 . "<br>";
    echo "var2=" . $var2;
  }
}

class Sub extends Manager{
  function a(){
    $var1 = 20;
    parent::a($var1); // you set $var1 parameter of function to 20; $var2 is set to the dafault value: 20
  }
}
$s = new Sub();
$s->a();

(ところで、関数を本当に再定義したい場合は、runkit 拡張機能を使用できますが、私はそれを考慮しません。)


また、さらにサブクラスがある場合は、この形式に合わせて変更できます。

于 2013-06-16T13:45:18.640 に答える