考虑以下代码:
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();
这将覆盖值并按您期望的方式工作。