Php 类不';t如果通过变量调用方法,则自动加载

Php 类不';t如果通过变量调用方法,则自动加载,php,composer-php,Php,Composer Php,我想将变量作为引用传递给通过字符串调用的静态方法,因此我不能使用call\u user\u func或call\u user\u func\u数组(无引用) 如图所示,我只想通过变量名调用函数: $f = '\\bbn\\appui\\history::trigger'; if ( is_callable($f) ){ $tmp = $f($table, $kind, $moment, $values, $where); } 我得到: 致命错误:调用未定义的函数\bbn\appui\his

我想将变量作为引用传递给通过字符串调用的静态方法,因此我不能使用
call\u user\u func
call\u user\u func\u数组(无引用)

如图所示,我只想通过变量名调用函数:

$f = '\\bbn\\appui\\history::trigger';
if ( is_callable($f) ){
  $tmp = $f($table, $kind, $moment, $values, $where);
}
我得到:

致命错误:调用未定义的函数\bbn\appui\history::trigger()

所以它是可调用的,但未定义??有趣的是,如果我将$f改为:

'\\\\bbn\\\\appui\\\\history::trigger'
(不要问我为什么尝试!),我得到:

致命错误:include():无法重新声明类bbn\appui\history

这个函数是作为另一个函数的回调调用的,所以通过变量调用它对我来说非常重要。有人会想到如何让它工作吗


我使用Composer及其自动加载类,我所有的类都是psr-0,我对它们的自动加载没有任何问题。

如果您运行的是PHP5.3.x,则可以使用:


如果您有较新的PHP版本,
eval
似乎是唯一的选项…

您不想调用函数,而是调用类的静态方法。它们之间的一个区别是,第二个不能像您试图做的那样直接调用。您需要
调用\u user\u func
。这里真正的问题是它是一个静态调用。应该有一个该对象的实例,然后调用trigger方法,一切都会正常工作。如果需要的话,它可以是非常动态的。它是类中使用的回调函数,可以是任何类型的函数/静态方法,但不能是现有的对象:函数是在调用其他对象之前调用的。我使用5.4,很快就会转到5.5。出于安全原因,我不可能在那里使用eval,但我想我找到了另一种方法,可以使用
call\u user\u func
,因为我不再需要引用。但遗憾的是,这不起作用:考虑到我收到的错误,它看起来确实像一个autolad缺陷,而不是PHP本身。老实说,我不知道为什么在第二个示例中会触发autoloader。你可以得到同样的结果。
$f = '\\bbn\\appui\\history::trigger';
list($class, $method) = explode('::', $f);
$rm = new ReflectionMethod($class, $method);
$rm->invoke(null, &$myvar);