我对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);
};
总有没有不用类就可以完成这项工作吗?
答案 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];
}