PHP 5.3之前的数组中的闭包对象

4

我知道在PHP 5.3中可以使用匿名函数实现以下功能,但是在旧版本的PHP(5.3之前)中是否有类似的替代方案?

  $exampleArray = array(  
    'func' => function() {  
      echo 'this is an example';  
      }

是否可以使用 __call 或将函数类型转换为 (object) 来实现此操作?另外,我尝试给函数命名以使其非匿名化,但似乎没有起作用。

4个回答

9
如果你想在PHP < 5.3中创建匿名函数,可以使用create_function函数。此外,这里有关于回调函数的有趣信息(可能会有用)。
下面是使用create_function的示例:
# This (function in other variable is only for cleaner code)
$func = create_function('', "echo 'This is example from anoymus function';");

$exampleArray = array(
  'func' => $func
  );

但是您可以通过另一种方式来完成与上面代码相同的操作:
# Create some function
function func()
{
   # Do something
   echo 'This is example';
}
# Save function name
$func = 'func';

上面的代码创建了一个函数来执行某些操作,然后我们将函数名存储在变量中(可以作为参数传递等)。

当我们只知道函数名称时调用函数:

第一种方式

$func();

替代方案

call_user_func($func);

以下是一个连接上述所有内容的示例:

function primitiveArrayStep(&$array, $function)
{
    # For loop, foreach can also be used here
    for($i = 0; $i < count($array);$i++)
    {
         # Check if $function is callable             
          if( is_callable($function) )
          {
               # Call function
           $function(&$array[$i]);
          }
          else
          {
               # If not, do something here
          }

    }    
}

并使用上述函数:

$array = array('a', 'b', 'c');

$myFunction = create_function('&$e', '$e = $e . " and i was here";');

primitiveArrayStep($array, $myFunction);

echo '<pre>';
var_dump($array);

返回:

array(3) {
  [0]=>
  string(16) "a and i was here"
  [1]=>
  string(16) "b and i was here"
  [2]=>
  string(16) "c and i was here"
}

链接:


6

是的,使用create_function函数,在PHP 5.3之前可以创建Lamda函数。但是,无法创建闭包,尽管您的问题提到了闭包但并未实际使用。

闭包是一个Lamda函数,它可以访问其封闭作用域中的变量:

$t = new Thingy;
$func = function( $y ) use( $t ) {
    //$t is available here when this function is called;
}

一个lambda函数是一个匿名函数,可以用于存储在变量中或作为参数传递等。您可以在5.3之前使用create_function()来实现:

$func = create_function( '$y', 'echo $y;' );

//similar to

$func = function( $y ){ echo $y };

3
$exampleArray = array(
    'func' => create_function('', 'echo "this is an example"');
);

create_function


鼓舞人心的回答。我学到了很多。感觉这个答案应该得到更多的关注。PHP 的力量如此强大。 - Benjamin Gruenbaum

0
创建一个带有'func'作为类方法的类怎么样?这在5.3之前或之后都可以工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接