【问题标题】:I want to use a class dynamically. Which is better than the following methods我想动态使用一个类。哪个比以下方法更好
【发布时间】:2017-08-01 19:08:24
【问题描述】:

class foo {
    function bar($arg, $arg2) {
        echo __METHOD__, " got $arg and $arg2\n";
    }
}

我想动态地使用一个类。哪个比以下方法好。

示例 1:

$a = [ new foo, 'bar' ];
$a(...["one", "two"]);

结果:

foo::bar 得到一个和两个

示例 2:

call_user_func_array([ new foo, 'bar' ], ["one", "two"]);

结果:

foo::bar 得到一个和两个

您还有其他建议吗?

【问题讨论】:

    标签: php arrays class dynamic


    【解决方案1】:

    这取决于您的更好的标准。我想在大多数情况下,速度差异将是微不足道的。我不太相信基准测试,但这里有some benchmarks 你可以看看。

    所以我们可以忽略速度差异,我们可以看看编码风格。 这是个人喜好问题,但我会这样做。当您使用splat operator(>=PHP5.6) 时,您可以直接致电variable function在对象上,不创建 callable:

    (new foo)->{'bar'}(...["one", "two"]);
    

    所以考虑一下你有一个更复杂的类:

    class Foo {
        public function bar($arg, $arg2)
        {
            echo __METHOD__, " got $arg and $arg2\n";
        }
    
        public function baz($arg)
        {
            echo __METHOD__, " got $arg\n";
        }
    
        public function quux()
        {
            echo __METHOD__;
        }
    }
    

    并有一个要调用的方法列表:

    $methods = [
        'bar' => ['one', 'two'],
        'baz' => ['one'],
        'quux' => []
    ];
    

    然后调用代码将如下所示:

    $object = new Foo;
    
    foreach ($methods as $method => $args) {
        $object->$method(...$args);
    }
    

    这里是working demo

    如您所见,它看起来比使用callablecall_user_func_array 更自然。

    【讨论】:

    • 感谢您的回答。我知道。
    • @Scaffold,那你的问题是什么?
    • 令我惊讶的是,一个类和方法在一个序列中是如何工作的,而不需要另一个函数。我的英语不好,我可以告诉你。
    • @Scaffold,这是callable 的有效形式:"实例化对象的方法作为数组传递,其中包含索引0 处的对象和索引1 处的方法名称. 允许从类中访问受保护的和私有的方法。”。这就是为什么您可以将这样的数组用作函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多