您可以将函数存储在 PHP 数组中吗?

Posted

技术标签:

【中文标题】您可以将函数存储在 PHP 数组中吗?【英文标题】:Can you store a function in a PHP array? 【发布时间】:2010-12-02 18:15:04 【问题描述】:

例如:

$functions = array(
  'function1' => function($echo)  echo $echo; 
);

这可能吗?最好的选择是什么?

【问题讨论】:

TL;DR - 自 php 5.4 起: $functions = [ 'function1' => function($echo) echo $echo; ]; ......因为 PHP 5.3 匿名函数可用,从 5.4 起你可以写 [] 而不是array() 【参考方案1】:

推荐的方法是使用anonymous function:

$functions = [
  'function1' => function ($echo) 
        echo $echo;
   
];

如果你想存储一个已经被声明的函数,那么你可以简单地通过名字来引用它作为一个字符串:

function do_echo($echo) 
    echo $echo;


$functions = [
  'function1' => 'do_echo'
];

在旧版本的 PHP (create_function(自 PHP 7.2 起已弃用):

$functions = array(
  'function1' => create_function('$echo', 'echo $echo;')
);

所有这些方法都列在callable pseudo-type 下的文档中。

无论您选择哪个,该函数都可以直接调用(PHP ≥5.4)或使用call_user_func/call_user_func_array

$functions['function1']('Hello world!');

call_user_func($functions['function1'], 'Hello world!');

【讨论】:

关于call_user_func:是$var = $functions["function1"],当function1返回值时,不好的做法? 嗨@Roy。由于$functions["functions1"] 包含一个可调用对象,将其分配给$var 将导致$var 也包含一个可调用对象。您仍然需要使用 $var() 调用它以获取返回值。 刚刚发现一个小bug,如果数组是类成员,PHP 5.3 方法不起作用,例如:class MyClass $functions = [ 'function1' => function($echo) 回声$回声; ]; @ZackMorris 评论应该在答案中指出,因为在课堂上这样做并不是一个不合理的想法(在找到他的评论之前,我至少发生了两次) 来自php.net Warning This function has been DEPRECATED as of PHP 7.2.0. Relying on this function is highly discouraged.【参考方案2】:

由于PHP“5.3.0 匿名函数变得可用”,使用示例:

请注意,这比使用旧的create_function 快得多...

//store anonymous function in an array variable e.g. $a["my_func"]
$a = array(
    "my_func" => function($param = "no parameter") 
        echo "In my function. Parameter: ".$param;
    
);

//check if there is some function or method
if( is_callable( $a["my_func"] ) ) $a["my_func"](); 
    else echo "is not callable";
// OUTPUTS: "In my function. Parameter: no parameter"

echo "\n<br>"; //new line

if( is_callable( $a["my_func"] ) ) $a["my_func"]("Hi friend!"); 
    else echo "is not callable";
// OUTPUTS: "In my function. Parameter: Hi friend!"

echo "\n<br>"; //new line

if( is_callable( $a["somethingElse"] ) ) $a["somethingElse"]("Something else!"); 
    else echo "is not callable";
// OUTPUTS: "is not callable",(there is no function/method stored in $a["somethingElse"])

参考:

匿名函数: http://cz1.php.net/manual/en/functions.anonymous.php

测试可调用:http://cz2.php.net/is_callable

【讨论】:

【参考方案3】:

警告 create_function() 自 PHP 7.2.0 起已弃用。强烈建议不要依赖此函数。

为了跟进 Alex Barrett 的帖子,create_function() 返回一个您可以实际用于调用函数的值,因此:

$function = create_function('$echo', 'echo $echo;' );
$function('hello world');

【讨论】:

【参考方案4】:

因为我可以...

扩展 Alex Barrett 的帖子。

我将进一步完善这个想法,甚至可能是外部静态类,可能使用“...”标记来允许可变长度参数。

在以下示例中,为了清楚起见,我使用了关键字“数组”,但方括号也可以。所示布局使用了一个 init 函数,旨在展示更复杂代码的组织结构。

<?php
// works as per php 7.0.33

class pet 
    private $constructors;

    function __construct() 
        $args = func_get_args();
        $index = func_num_args()-1;
        $this->init();

        // Alex Barrett's suggested solution
        // call_user_func($this->constructors[$index], $args);  

        // RibaldEddie's way works also
        $this->constructors[$index]($args); 
    

    function init() 
        $this->constructors = array(
            function($args)  $this->__construct1($args[0]); ,
            function($args)  $this->__construct2($args[0], $args[1]); 
        );
    

    function __construct1($animal) 
        echo 'Here is your new ' . $animal . '<br />';
    

    function __construct2($firstName, $lastName) 
        echo 'Name-<br />';
        echo 'First: ' . $firstName . '<br />';
        echo 'Last: ' . $lastName;
    


$t = new pet('Cat');
echo '<br />';
$d = new pet('Oscar', 'Wilding');
?>

好的,现在精简为一行...

function __construct() 
    $this->'__construct' . (func_num_args()-1)(...func_get_args());

可用于重载任何函数,而不仅仅是构造函数。

【讨论】:

【参考方案5】:

通过使用闭包,我们可以将函数存储在数组中。基本上,闭包是一个可以在没有指定名称的情况下创建的函数 - 一个匿名函数。

$a = 'function';
$array=array(
    "a"=> call_user_func(function() use ($a) 
        return $a;
    )
);
var_dump($array);

【讨论】:

以上是关于您可以将函数存储在 PHP 数组中吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将图像存储在数组中吗?

Java可以将方法存储在数组中吗?

我可以将关联数组放入要在 PHP 中处理的表单输入中吗?

将php数组传递给jquery函数

PHP 数组

您可以将发布计划中的工件存储在 Visual Studio Team Services 中吗?