我为我们公司建立了一个CMS,它具有大量功能,其中许多功能与我们使用CMS的大多数站点都没有使用的特定功能相关。那么,我的目标是仅在需要时(在调用函数时)包含函数的脚本。
现在我只是正常调用每个函数,需要函数的实际脚本所在的文件,然后调用第二个函数(与函数同名,但带有下划线前缀)包含函数的实际脚本。例如:
function foo($a,$b) {
require_once "funtions-foo.php";
return _foo($a,$b);
}
然而,这对我来说似乎有点重复。我正在寻找的是一种“捕获”函数调用的方法,如果它的名称是“包含”函数的数组,我将包含正确的文件并调用该函数。例如:
catch_function_call($function,$arg1,$arg2) {
$array = array(
'foo' => 'functions-foo.php',
'bar' => 'functions-bar.php'
);
if($array[$function]) {
require_once $array[$function];
return $function($arg1,$arg2);
}
}
我假设'catch_function_call'函数可以在调用函数时以某种方式捕获。然而,据我所知,没有这样的功能,我的第二个想法是简单地使用变量定义每个“包含”函数。例如:
$array = array(
'foo' => 'functions-foo.php',
'bar' => 'functions-bar.php'
);
foreach($array as $function => $file) {
function $function($arg1,$arg2) {
$_function = "_".$function;
require_once $file;
return $_function($arg1,$arg2);
}
}
当然,这给了我一个错误,因为我在定义函数时显然不能在函数名中使用变量。有关如何绕过这个或其他解决方案的想法,仅在需要时包含一个功能吗?
答案 0 :(得分:1)
您可以分别在对象或类上使用__call
或__callStatic
,这将近似于您要查找的功能。您可以在this thread中阅读一些解释。
但是在全局函数空间中无法做到这一点。
答案 1 :(得分:0)
这有用吗:http://php.net/manual/en/function.create-function.php?
或者可以将设计转为OO并使用__call()
。
答案 2 :(得分:0)
在每个需要的功能之前使用include_once
?
答案 3 :(得分:0)
您是否考虑将函数分组并将其作为静态方法存储在对象中。然后你可以使用__autoload()函数并停止担心何时包含。
所以:
class Rarely_Used{
static function foo(){}
static function bar(){}
}
class Only_for_Managers{
static function ohboy(){}
static function punish(){}
}
答案 4 :(得分:0)
为什么包含所有文件这么大的问题?由于您可能正在使用APC繁重的文件系统访问不会有问题。除此之外,如果有更多的函数,函数哈希表中的查找显然会更慢,但这肯定不会成为应用程序的瓶颈。