如何在PHP中创建函数引用?

时间:2011-10-25 16:03:54

标签: php

我正在尝试创建一个关联数组,其值是对函数的引用。这样做的正确方法是什么?这段代码有效,但给了我一个警告。

代码

<?php

$mergeCodes = array(
    'rev:(\d+)' => reverse_me,
);

$test = "This is a [[rev:1234]] test";

echo "BEFORE: $test\n";
foreach ($mergeCodes as $code => $callback) {
    $code = '\[\[' . $code . '\]\]';
    $test = preg_replace_callback( "/$code/", $callback, $test );
}
echo "AFTER: $test\n";

function reverse_me($input) {
    return strrev($input[1]);
}

?>

输出

PHP Notice:  Use of undefined constant reverse_me - assumed 'reverse_me' in /tmp/test2.php on line 4
BEFORE: This is a [[rev:1234]] test
AFTER: This is a 4321 test

3 个答案:

答案 0 :(得分:1)

据我所知,PHP没有这样的概念。您可能对JavaScript感到困惑。

您的最终目的似乎是打电话给preg_replace_callback()。顾名思义,你必须用callback来提供它,这很简单。您只需要一个包含以下其中一个的常规变量:

  • 具有变量名称的字符串:'foo'
  • 具有类名称和方法名称的数组:array('Foo', 'doBar')
  • 包含类实例和方法名称的数组:array($myFoo, 'doBar')

http://php.net/manual/en/language.pseudo-types.php#language.types.callback

找到进一步的参考资料

答案 1 :(得分:1)

在PHP 5.3中,您可以将匿名函数(closures)存储在变量中:

$reverse_me = function($input) {
  return strrev($input[1]);
}

$mergeCodes = array(
  'rev:(\d+)' => $reverse_me
);

或者你甚至可以这样做:

$mergeCodes = array(
  'rev:(\d+)' => function($input) {
    return strrev($input[1]);
  }
);

有关详细信息,请参阅http://php.net/functions.anonymous

答案 2 :(得分:0)

我通过将值设为字符串'reverse_me'来修复它。我猜$callback是一个字符串对我来说不是很直观。