PHP получает статические методы

я хочу вызвать метод класса с помощью var (например):

$var = "read";
$params = array(...); //some parameter
if(/* MyClass has the static method $var */)
{
  echo MyClass::$var($params);
}
elseif (/* MyClass hat a non-static method $var */)
{
  $cl = new MyClass($params);
  echo $cl->$var();
}
else throw new Exception();

я прочитал в руководстве по php, как получить функции-члены класса (get_class_methods). но я всегда получаю каждого члена без информации, является ли он статическим или нет.

как я могу определить контекст метода?

спасибо за помощь


person 0xDEADBEEF    schedule 28.11.2011    source источник
comment
Также обратите внимание, что в PHP поддерживается вызов статического метода из переменной экземпляра.   -  person JRL    schedule 12.12.2011


Ответы (2)


Используйте класс ReflectionClass:

On Codepad.org: http://codepad.org/VEi5erFw
<?php

class MyClass
{
  public function func1(){}
  public static function func2(){}
}

$reflection = new ReflectionClass('MyClass');
var_dump( $reflection->getMethods(ReflectionMethod::IS_STATIC) );

Это выведет все статические функции.

Или, если вы хотите определить, является ли данная функция статической, вы можете использовать класс ReflectionMethod:

На Codepad.org: http://codepad.org/2YXE7NJb

<?php

class MyClass
{
  public function func1(){}
  public static function func2(){}
}

$reflection = new ReflectionClass('MyClass');

$func1 = $reflection->getMethod('func1');
$func2 = $reflection->getMethod('func2');

var_dump($func1->isStatic());
var_dump($func2->isStatic());
person ComFreek    schedule 28.11.2011
comment
Это в основном то, что я собирался сказать, вы можете использовать hasMethod $func1, чтобы определить, следует ли выбрасывать и исключение - person Jason Brumwell; 28.11.2011

Один известный мне способ — использовать Reflection. В частности, можно было бы использовать ReflectionClass::getMethods как таковой:

$class = new ReflectionClass("MyClass");
$staticmethods = $class->getMethods(ReflectionMethod::IS_STATIC);
print_r($staticmethods);

Сложность в том, что вам нужно включить Reflection, чего по умолчанию нет.

person FrozenFire    schedule 28.11.2011