可以参考静态函数并运行吗?像这样:
namespace vendor\foo;
class Bar
{
public static function f1()
{
echo 'f1';
}
public static function f2($id)
{
echo 'f2: '.$id;
}
}
和
$fs = array(
'f1'=>\vendor\foo\Bar::f1,
'f2'=>\vendor\foo\Bar::f2
);
$fs['f1']();
$fs['f2']('some id');
或唯一的方法是call_user_func
?
注意: php 5.3
答案 0 :(得分:0)
我不记得PHP 5.3是否支持这种功能,但您可以在5.4中执行此操作:
<?php
namespace Vendor;
class Foo
{
public static function bar()
{
echo "bar\n";
}
}
$funcs = [
'bar' => ['\Vendor\Foo', 'bar']
];
$funcs['bar']();
答案 1 :(得分:0)
在PHP 5.3中,它取决于所使用的回调类型。您提供的示例(它是对象的方法)无法以所述方式调用。如果示例是一个过程函数,您可以使用您提供的代码调用它。
我不确定为什么这是技术理解的情况,但我的猜测是PHP解析器查找名为\vendor\foo\Bar::f1
的函数,但找不到它。如果您希望调用变量函数,即$var()
,则$var
必须是函数而不是对象方法。如果您想调用变量方法,请查看以下示例。
以下示例是调用变量静态对象方法的有效方法:
<?php
class Foo {
public static function a() {
echo 'Foo::a()';
}
public static function b() {
echo 'Foo::b()';
}
}
$foo = 'Foo';
$aFunc = 'a';
$bFunc = 'b';
$foo::$aFunc();
Foo::$bFunc();
call_user_func('Foo::' . $aFunc);
call_user_func(array($foo, 'b'));
?>
答案 2 :(得分:0)
您有多个选项可以执行此操作
以下示例将演示以下选项:
<?php
namespace vendor\foo;
class Bar {
public static function foo($arg) {
return 'foo ' . $arg;
}
}
选项1:对类名和方法名使用字符串变量:
/* prepare class name and method name as string */
$class = '\vendor\foo\Bar';
$method = 'foo';
// call the method
echo $class::$method('test'), PHP_EOL;
// output : foo test
选项2:Perpare回调变量并将其传递给call_user_func()
:
/* use a callback to call the method */
$method = array (
'\vendor\foo\Bar', // using a classname (string) will tell call_user_func()
// to call the method statically
'foo'
);
// call the method with call_user_func()
echo call_user_func($method, 'test'), PHP_EOL;
// output : foo test
选项3:使用ReflectionMethod :: invoke():
/* using reflection to call the method */
$method = new \ReflectionMethod('\vendor\foo\Bar', 'foo');
// Note `NULL` as the first param to `ReflectionMethod::invoke` for a static call.
echo $method->invoke(NULL, 'test'), PHP_EOL;
// output : foo test
答案 3 :(得分:-1)
是的,这是可能的。但你尝试的方式不会奏效。您必须使用callable:
$fs = array(
'f1'=>array('\vendor\foo\Bar', 'f1'),
'f2'=>array('\vendor\foo\Bar', 'f2')
);
$fs['f1']();
$fs['f2']('some id');