2

是否可以引用静态函数并运行?像这样:

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

4

4 回答 4

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']();
于 2013-01-07T19:18:50.567 回答
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'));

?>
于 2013-01-07T21:48:34.103 回答
0

您有多种选择可以做到这一点

  1. 使用字符串变量作为类名和方法名
  2. 将回调与 call_user_func() 一起使用
  3. 使用反射

以下示例将演示这些选项:

<?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
于 2013-01-08T01:02:00.117 回答
-1

是的,这是可能的。但是你尝试的方式是行不通的。您必须使用可调用的:

$fs = array(
    'f1'=>array('\vendor\foo\Bar', 'f1'),
    'f2'=>array('\vendor\foo\Bar', 'f2')
);

$fs['f1']();
$fs['f2']('some id');
于 2013-01-07T18:47:11.077 回答