有没有办法调用一个继承的方法,而没有指定它的函数名?
类似的东西:
class Child extends Parent {
function some_function(){
// magically inherit without naming the parent function
// it will call parent::some_function()
parent::inherit();
// other code
}
function another_function(){
// it will call parent::another_function()
$result = parent::inherit();
// other code
return $result;
}
}
我可以想到使用debug_backtrace()
执行此操作,获取调用inherit()的最后一个函数,并使用相同的函数名访问它的父级。我想知道是否有更好的方法而不是使用显然不适用于此的调试功能。
答案 0 :(得分:5)
您可以使用magic __FUNCTION__
constant.
class A
{
function some_function()
{
echo 'called ' . __METHOD__;
}
}
class B extends A
{
function some_function()
{
call_user_func(array('parent', __FUNCTION__));
}
}
$b = new B;
$b->some_function(); // prints "called A::some_function"
而不是
call_user_func(array('parent', __FUNCTION__));
你也可以
parent::{__FUNCTION__}();
答案 1 :(得分:1)
很脏,但是:
class Adult {
function mummy(){
return 'Walk like an Egyptian';
}
function daddy(){
return 'Luke, I am your father';
}
}
class Child extends Adult {
function mummy(){
echo 'Mummy says: ';
$me = explode('::',__METHOD__)[1];
echo parent::$me();
}
function daddy(){
echo 'Daddy says: ';
$me = explode('::',__METHOD__)[1];
echo parent::$me();
}
}
$o = new Child();
$o->mummy();
$o->daddy();
修改强>
实际上给你一个名为inherit()的父方法;
class Adult {
private function mummy(){
return 'Walk like an Egyptian';
}
private function daddy(){
return 'Luke, I am your father';
}
protected function inherit($method) {
$beneficiary = explode('::', $method)[1];
return $this->$beneficiary();
}
}
class Child extends Adult {
public function mummy() {
echo 'Mummy says: ',
parent::inherit(__METHOD__),
PHP_EOL;
}
public function daddy() {
echo 'Daddy says: ',
parent::inherit(__METHOD__),
PHP_EOL;
}
}
$o = new Child();
$o->mummy();
$o->daddy();
答案 2 :(得分:0)
动态调用函数:
static::$functionName();
在你的情况下:
$func = __FUNCTION__;
parent::$func();
注意:函数名必须是字符串,如果它是实际函数(在此上下文中不相关),则首先需要首先将其转换为字符串名称。
从长远来看,你的问题可能会引导你走向其他的东西。
查看late static binding这就是您要找的内容。
从链接页面获取的示例。
class A {
public static function who() {
echo __CLASS__;
}
public static function test() {
static::who(); // Here comes Late Static Bindings
}
}
class B extends A {
public static function who() {
echo __CLASS__;
}
}
B::test();