有没有办法以类似
的方式动态定义几个类似的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()
函数,因为它在最终的应用程序托管中被禁用。
答案 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)