有什么方法可以返回使用use接口导入的函数吗?

时间:2019-07-06 23:54:36

标签: php import

我对PHP相当陌生,所以我迷失了这个问题。

我有一个带有调度功能的索引文件。我想返回渲染功能或使用时导入的整个模块。

use function App\renders\deepRender\render as deepRendering;
use function App\renders\plainRender\render as plainRendering;
use App\renders\deepRender;
use App\renders\plainRender;

function getRenderMethod($renderType)
{
    $renderers = [
        "pretty" => deepRender, //or using deepRendering
        "plain" => plainRender, //or using  plainRendering
    ];

    // i have tried returning it like that.
    return $renderers[$renderType];

然后在其他地方尝试

$renderer = getRenderMethod($renderType);
$renderer\render();

但这不起作用。当$ renderers数组直接保留函数时,我也尝试过从cb运行函数。

return function ($ast) use ($renderers, $renderType) {
    $renderer = $renderers[$renderType];
    return $renderer($ast);
};

总有没有不用类就可以完成这项工作吗?

2 个答案:

答案 0 :(得分:1)

PHP没有任何“模块”的概念。命名空间只是按名称对事物进行分组的方式,并不意味着其他任何关系。文件顶部的use语句仅允许您在当前文件内写一个较短的名称​​ ,该名称在编译代码时会扩展。

这样,您不能传递对名称空间的引用,因为名称空间不是真正的东西,它只是“内部”事物名称的一部分。您可以传递包含名称空间前缀的 string ,但是它需要包含完整前缀,而不是{{1}在当前文件中引入的别名。 }。

一种更有用的方法是绕过该语言中具有“一流”存在的事物,即:

  • 一个对象。您的两种渲染模式可以是实现特定接口的对象实例。该接口将指定对象必须具有use方法,而不是编写render,而是编写$renderer\render();
  • 一个匿名函数。在这种情况下,您的两种渲染模式将简单地定义为不带名称的函数,即直接称为$renderer->render();。如果实现较小,而不是整个“模块”,则此方法最有用。

答案 1 :(得分:0)

最适合我的解决方案是:

use function App\renders\deepRender\render as deepRendering;
use function App\renders\plainRender\render as plainRendering;

function getRenderMethod($renderType)
{
    $renderers = [
        "pretty" => function ($ast) {
            return deepRendering($ast);
        },
        "plain" => function ($ast) {
            return plainRendering($ast);
        },
    ];
    return $renderers[$renderType];
}