2012-02-25 29 views
11

我似乎无法找到任何这个,并想知道是否有可能存储一个函数或函数引用作为数组元素的值。对于例如功能作为数组值

array("someFunc" => &x(), "anotherFunc" => $this->anotherFunc()) 

谢谢!

+0

可能存在[可以在PHP数组中存储函数吗?](http://stackoverflow.com/questions/1499862/can-you-store-a-function-in-a-php-array) – nawfal 2015-11-11 11:29:42

+0

'x()'不是函数或对函数的引用,而是函数调用;即该函数现在被执行,并且它返回的值被存储在你的数组中'someFunc'。阅读关于[功能](http://php.net/manual/en/language.functions.php)的PHP文档以获取更多信息(包括对您问题的回答)。 – axiac 2015-11-11 11:37:24

回答

13

你可以在“参考”的任何功能。函数引用不是“内存中的地址”或某种意义上的引用。这仅仅是函数的名字。

<?php 

$functions = array(
    'regular' => 'strlen', 
    'class_function' => array('ClassName', 'functionName'), 
    'object_method' => array($object, 'methodName'), 
    'closure' => function($foo) { 
    return $foo; 
    }, 
); 

// while this works 
$functions['regular'](); 
// this doesn't 
$functions['class_function'](); 

// to make this work across the board, you'll need either 
call_user_func($functions['object_method'], $arg1, $arg2, $arg3); 
// or 
call_user_func_array($functions['object_method'], array($arg1, $arg2, $arg3)); 
+0

好的,谢谢!所以最终,我想我正在寻找一种方法来创建一个指针。我不想复制一个函数,但只需要一个指向它的指针,这样我就可以修改和读取指针所指向的值。 – user784446 2012-02-25 13:00:35

+0

该死的,只是意识到,call_user_func是PHP的函数方法库的实际成员!谢谢! – user784446 2012-05-19 07:53:18

+0

解析错误:语法错误,第7行出现意外的T_FUNCTION – 2013-06-08 07:48:24

5

PHP支持变量函数的概念,所以你可以做这样的事情:

function foo() { echo "bar"; } 
$array = array('fun' => 'foo'); 
$array['fun'](); 

YOUT可以manual查看更多的例子。

+1

谢谢,正在考虑将此作为解决方案。但文档也指出一个元素的值可以是任何类型,所以为什么不能使用函数呢?我可以使用“element”=> object(),但不知道可以用这个做什么。 – user784446 2012-02-25 12:09:32

5

查看PHP的call_user_func。考虑下面的例子。

考虑,如果你想在你可以用一个循环做一个顺序执行所有功能两种功能

function a($param) 
{ 
    return $param; 
} 

function b($param) 
{ 
    return $param; 
} 


$array = array('a' => 'first function param', 'b' => 'second function param'); 
现在

foreach($array as $functionName => $param) { 
    call_user_func($functioName, $param); 
} 

加数组可以保存任何数据类型,无论是函数调用,嵌套的数组,对象,字符串,整数等等,等等

+0

我只想补充说,当你不希望你的方法过于复杂时,这是一个很好的方法来替换长开关语句。 – 2015-04-25 13:06:25

4

是的,你可以:

$array = array(
    'func' => function($var) { return $var * 2; }, 
); 
var_dump($array['func'](2)); 

这不,当然需要PHP anonymous function支持,这与PHP版本5.3.0到达。尽管如此,这会给你留下难以辨认的代码。

+0

这不适合我,它返回意外的T_FUNCTION错误。 – user784446 2012-02-25 13:05:23

+0

您使用的是什么版本的PHP?它在运行PHP 5.3.6的笔记本电脑上运行良好。如果你使用5.2,那么这肯定不会像我在上面的回答中提到的那样工作。 – Treffynnon 2012-02-25 13:06:40

+0

啊,好的。这可能是为什么。我正在使用PHPDesigner2008,所以它的错误通知库可能已过时。 – user784446 2012-02-25 13:08:18