【问题标题】:Isn't this switch statement a nonsense?这个switch语句不是废话吗?
【发布时间】:2015-06-27 07:18:03
【问题描述】:

我在Laravel 5 core 中发现了这个奇怪的 switch 语句:

switch (count($args)) {
    case 0:
        return $instance->$method();
    case 1:
        return $instance->$method($args[0]);
    case 2:
        return $instance->$method($args[0], $args[1]);
    case 3:
        return $instance->$method($args[0], $args[1], $args[2]);
    case 4:
        return $instance->$method($args[0], $args[1], $args[2], $args[3]);
    default:
        return call_user_func_array([$instance, $method], $args);

他们有什么理由决定建造这样的东西而不是仅仅使用它吗?

return call_user_func_array([$instance, $method], $args);

有什么好处吗?

【问题讨论】:

  • 也许这是从具有函数重载的语言翻译而来的。或者,他们发现在最常见的情况下(大概 $args 为 4 或更少)会有轻微的性能提升。
  • 这不是废话..像c++这样的语言都支持this及其所谓的函数重载,多态可以通过重载实现
  • @NullPoiиteя 但是 PHP 没有函数重载。
  • 对我来说似乎有点笨拙,我很想知道 $method 内部正在做什么。

标签: php laravel switch-statement laravel-5


【解决方案1】:

恕我直言,程序员避免对call_user_func_array() 进行合理数量的对$instance->method() 的典型调用。当然直接调用方法比使用call_user_func_array()更快。代码是用爱写的:)

【讨论】:

  • 也许 Laravel 很快需要 PHP 5.6+,然后他们就能做这个花哨的小事:return $instance->method(...$args);
  • @RoboRobok 我想这段代码的直接影响来自this comment 对 PHP 文档中的函数。 Github 显示代码最初是在 2010 年 1 月提交的,因此作者很可能担心 PHP 5.3 的性能。
  • @patricus 不错!想知道为什么那里的所有 cmets 都被否决了。
【解决方案2】:

可能有最多 4 个参数的函数期望按值传递而不是按引用传递。请注意关于 PHP 5.4 之前使用的函数文档的注释。 call_user_func_array docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    相关资源
    最近更新 更多