在定义PHP函数的名称时是否可以使用变量?

时间:2010-11-09 19:14:12

标签: php function variables

我为我们公司建立了一个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);

    }
}

当然,这给了我一个错误,因为我在定义函数时显然不能在函数名中使用变量。有关如何绕过这个或其他解决方案的想法,仅在需要时包含一个功能吗?

5 个答案:

答案 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繁重的文件系统访问不会有问题。除此之外,如果有更多的函数,函数哈希表中的查找显然会更慢,但这肯定不会成为应用程序的瓶颈。