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

在这里,我试图覆盖$var1fromSub::a()然后调用其父函数的值Manager::a(),希望 php 将$var1=20结果设置和显示为400(20 x 20)。但这似乎不起作用。$var1仍等于10

想知道是否有办法部分覆盖 php 中可以覆盖函数局部变量的函数?特别是在这段代码中,我怎样才能摆脱400, 而不是 current 200

[编辑]

Sub只是一个例子,我将有多个子类,如Sub1, Sub2, Sub3& 等等。因此每个子类都会尝试为 设置不同的值$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 回答