PHP中子类实例如何调用父类Foo的func()方法?
在PHP中调用被子类重写的父类方法
当然可以啦!PHP提供了几种直观的方式来实现类似你说的C++里强制调用父类重写方法的需求,我结合你的示例代码给你一步步讲清楚。
先回顾下你的基础场景
你给出的PHP代码是这样的:
class Foo { protected static $a = 1; protected $b = 2; public function func() { return 'foo' . static::$a . $this->b; } } class Bar extends Foo { protected static $a = 3; protected $b = 4; public function func() { return 'bar' . static::$a . $this->b; } } $obj = new Bar(); echo $obj->func(); // 输出 'bar34'
你提到C++里能通过强制类型转换调用父类的func()得到'foo14',PHP里不用这么绕,有更直接的语法。
方法1:子类内部直接调用父类方法
如果是在Bar类的方法里想调用Foo的func(),直接用parent::关键字就行,这是PHP里调用父类重写方法的标准写法:
class Bar extends Foo { protected static $a = 3; protected $b = 4; public function func() { return 'bar' . static::$a . $this->b; } // 新增一个方法调用父类的func public function callParentFunc() { return parent::func(); } } $obj = new Bar(); echo $obj->callParentFunc(); // 这里输出 'foo34'
这里要注意:static::$a是PHP的后期静态绑定特性,它会指向当前运行的类(也就是Bar),所以用的是子类的$a=3;而$this->b是实例属性,当前实例是Bar,所以用的是$b=4。如果想得到和你C++示例一样的'foo14',只要把父类里的static::$a改成self::$a就行——self会严格指向定义该方法的类(也就是Foo),这样就会用父类的$a=1了。
方法2:外部直接调用父类方法(不用修改子类)
如果不想改动Bar类,在外部直接调用Foo的func()方法,也有两种靠谱的方式:
方式A:用类名直接调用并传入实例
PHP 7.0+支持在调用非静态方法时,通过静态调用的方式传入$this参数:
$obj = new Bar(); echo Foo::func($obj); // 输出 'foo34'(同样,改父类的static为self就能得到foo14)
方式B:用闭包绑定上下文
更规范的方式是用闭包绑定实例和类作用域,这样能确保调用的是父类的方法:
$obj = new Bar(); // 定义一个匿名函数,内部调用父类的func $parentFunc = function() { return parent::func(); }; // 把这个闭包绑定到Bar实例,并且指定作用域为Foo类 $boundFunc = $parentFunc->bindTo($obj, Foo::class); echo $boundFunc(); // 输出 'foo34'
或者用call_user_func直接指定父类方法:
echo call_user_func([$obj, 'Foo::func']); // 同样输出 'foo34'
内容的提问来源于stack exchange,提问作者l00k
相关产品推荐
相关产品推荐

