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



我是PHP的新手,所以我偶然发现了这个问题。

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

use function ApprendersdeepRenderrender as deepRendering;
use function ApprendersplainRenderrender as plainRendering;
use ApprendersdeepRender;
use ApprendersplainRender;
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);
$rendererrender();

但这无效。当$渲染器数组直接持有函数时,我也尝试过从CB运行功能。

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

无论如何是否可以在不使用类的情况下进行此工作?

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

因此,您无法将其引用到名称空间,因为名称空间并不是真正的事情,它只是"内部"事物名称的一部分。您可以将包含名称空间前缀的A String 传递,但是它需要包含完整的前缀,而不是通过use语句在当前文件中引入的别名。/p>

一种更有用的方法是传递语言中具有"一流"的事物,即:

  • 一个对象。您的两个渲染模式可能是实现特定接口的对象的实例。界面将指定对象必须具有render方法,而不是编写$rendererrender();,您会编写$renderer->render();
  • 一个匿名功能。在这种情况下,您的两个渲染模式将简单地定义为没有名称的函数,直接称为$renderer()。如果实现很小,则最有用的方法是最有用的,而不是整个"模块"。

对我有用的解决方案是:

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

最新更新