部分覆盖php中的函数


Partially override a function in php

考虑以下代码:

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

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

想知道是否有一种方法来部分覆盖一个函数在php的局部变量的函数可以被覆盖?具体来说,在这段代码中,我如何摆脱400,而不是当前的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();
      }
    }

No。你可以设置一个默认的函数参数,但是你不能覆盖你调用的函数的局部值。

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扩展;但是我不会考虑的。


同样,当你有更多的子类时,你可以改变它们来匹配这个格式

类方法内部变量的作用域始终是局部的。重写或调用父方法不会改变任何东西。

如果我必须动态赋值并相应地更改它,我更愿意使用类属性。

例如

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

这将覆盖值并按您期望的方式工作。