我正在尝试get_called_class()
在父类上使用,并检索父类名称而不是子类名称。在这种情况下我不能使用它,因为我需要在动态上下文中使用它,因为这些方法实际上是使用and__CLASS__
插入到现有类中的。Closure::bind
__call
快速示例:
<?php
class Test {
function doSomething() {
echo(get_called_class() . ",");
}
}
class TestSuper extends Test {
function doSomething() {
echo(get_called_class() . ",");
parent::doSomething();
}
}
$test = new TestSuper();
$test->doSomething();
?>
此示例打印TestSuper,TestSuper,
,但我想要get_called_class()
动态获取方法所在的类(打印TestSuper,Test,
)而不是被调用的类。它还必须在魔法__call
方法中起作用。这可能吗?
更新:更好的例子更接近地反映了我正在做的事情:我有一个方法列表,我想在运行时(在$addons
变量中)应用到实例(或类):
<?php
$addons = array(
"A" => array(
"doSomething" => function () { return 10; }
),
"B" => array(
"doSomething" => function () { return parent::doSomething() + 1; }
)
);
class A {
private $methods = array();
function __construct() {
global $addons;
$class = get_class($this);
do {
foreach ($addons[$class] as $name => $method) {
$this->methods[$class][$name] = Closure::bind($method, $this, $class);
}
$class = get_parent_class($class);
} while ($class !== false);
}
function __call($name, $arguments) {
$class = get_class($this); // Or something else...
do {
if (isset($this->methods[$class][$name])) {
return call_user_func_array($this->methods[$class][$name], $arguments);
}
$class = get_parent_class($class);
} while ($class !== false);
}
}
class B extends A {
}
$b = new B();
echo($b->doSomething() . "\n");
?>
我正在向 中添加一个方法doSomething
,A
并在其上覆盖它B
,但我想在那里调用parent::doSomething()
将执行A
的doSomething
. 不幸的是,在执行父方法时,我无法找到一种方法来知道我想A
改用 run 的方法,所以它总是runB
并最终用完堆栈帧。我如何知道在内部__call
方法中执行超类方法?