In meinem Fall musste ich eine Methode in der Elternklasse erstellen, die eine statische Methode mit call_user_func()
in einer Unterklasse aufrufen kann. Wenn Sie den vollständigen Klassennamen kennen, können Sie call_user_func()
kein Problem. Der Trick bestand darin, eine statische Methode im Namespace der Unterklasse aufzurufen.
So haben wir das heißt
\MyTools\AbstractParent
\Something\Else\Foo extends \MyTools\AbstractParent
\Something\Else\Bar extends \MyTools\AbstractParent
Wir haben nun ein Verfahren in AbstractParent
müssen. Diese Methode, die von der Unterklasse Foo
aufgerufen wird, kann Bar::doMe()
aufrufen, indem sie ihren eigenen Namensraum vorstellt.
Hier ist, wie Sie es mit dynamischem Aufruf tun:
namespace MyTools;
abstract class AbstractParent {
public static method doMe(){}
public function callSomethingStaticInClass($class){
// current namespace IS NOT MyTools
// so you cannot use __NAMESPACE__
$currentClass = get_class($this);
$refl = new ReflectionClass($currentClass);
$namespace = $refl->getNamespaceName();
// now we know what the subclass namespace is...
// so we prefix the short class name
$class = $namespace . '\\' . $class;
$method = 'doMe';
return call_user_func(array($class, $method));
}
};
namespace Something\Else;
class Foo extends AbstractParent { }
class Bar extends AbstractParent { }
$foo = new Foo();
$foo->callSomethingStaticInClass('Bar');
Um es mit einem statischen Aufruf ersetzen funktioniert get_class($this)
mit get_called_class()
Auch wenn Sie nicht ausdrücklich danach gefragt werden, könnten Sie sich auch für das Schlüsselwort 'namespace' interessieren, http://doc.php.net/language.namespaces.nsconstants, z. 'echo namespace \ MyClass :: myFunction();' – VolkerK
Danke, ich bin mir dessen bewusst, aber leider funktioniert es in dieser Situation nicht! :) –