В моем случае мне нужно было создать метод в родительском классе, который может вызывать статический метод с call_user_func()
в некотором подклассе. Если вы знаете полное имя класса, вы можете call_user_func()
без проблем. Хитрость заключалась в том, чтобы вызвать статический метод в пространстве имен подкласса.
Итак, у нас есть, т.е.
\MyTools\AbstractParent
\Something\Else\Foo extends \MyTools\AbstractParent
\Something\Else\Bar extends \MyTools\AbstractParent
Теперь нам нужен метод в AbstractParent
. Этот метод, вызываемый из подкласса Foo
, сможет вызывать Bar::doMe()
, добавляя свое собственное пространство имен.
Вот как вы делаете это с динамическим вызовом:
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');
Чтобы он работал со статическим вызовом, замените get_class($this)
на get_called_class()