PHP动态定义一堆函数

时间:2014-01-30 11:40:21

标签: php function eval alias

有没有办法以类似

的方式动态定义几个类似的php函数
define('MAX_LOG_LEVEL', 10);

_log_level( $string, $level = 0 ) {
   global $loglevel;
   if( $level >= $loglevel ) {
     file_put_contents(...);
   }
}

for($level = 0; $level < MAX_LOG_LEVEL; $level++) {
   function _log$level( $string ) {
      _log_level( $string, $level );
   }
}

那是因为我必须创建自己的日志例程并根据需要快速添加日志信息。

我知道create_function内置的php并没有真正做到我想要的东西,因为在使用它的函数/方法中导入引用变量是必要的

我不能使用this question中解释的eval()函数,因为它在最终的应用程序托管中被禁用。

2 个答案:

答案 0 :(得分:2)

这样做的一种方法是为变量分配anonymous function并像这样调用它:

foreach (range(1, 9) as $i)
{

  ${'_log' . $i} = function($string) use ($i)
  {
    echo 'Log ' . $i . ': ' . $string;
  };

}

// Outputs Log 9: Test
$_log9('Test');

另一种可能性是使用eval(尽管您不能在当前应用程序中使用它,但在未来的环境中可能会这样做):

foreach (range(1, 9) as $i)
{

  eval('

    function _log' . $i . '($string)
    {
      echo \'Log ' . $i . ': \' . $string;
    }

  ');

}

// Outputs Log 9: Test
_log9('Test');

如果使用后一种方法,请注意手册中的警告:

  

警告 eval()语言构造非常危险,因为它允许执行任意PHP代码。 因此使用它   泄气。如果您已经仔细确认没有其他的   选项比使用这个结构,特别注意不要通过   任何用户都没有正确验证数据   预先。

但是,正如其他人在评论中提到的那样,最好不要为每个日志级别定义一个唯一的函数:而是使用日志级别作为参数定义单个函数:

function _log($i, $string)
{
  echo 'Log ' . $i . ': ' . $string;
}

// Outputs Log 9: Test
_log(9, 'Test');

对此的进一步扩展是定义日志级别,以使自己和未来的程序员更清楚地记录了什么:

define('_LOG_CRITICAL_ERROR', 9);

function _log($i, $string)
{
  echo 'Log ' . $i . ': ' . $string;
}

// Outputs Log 9: Test
_log(_LOG_CRITICAL_ERROR, 'Test');

答案 1 :(得分:0)

是的,这是可能的;你可以这样做:

$function = '_log' . $level;
$function($string);

这称为variable function