我是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];
}