有没有办法检查匿名函数?

时间:2012-06-02 11:29:58

标签: php function

假设我有一个数组如下:

array(
    [0] => function() { return "hello"; }
    [1] => function() { return "world"; }
    [2] => "look"
    [3] => function() { return "and";}
    [4] => function() { return "listen";}
)

有没有办法可以调用0,1,3和4而不调用2?

4 个答案:

答案 0 :(得分:16)

匿名函数是Closure类的实例。因此,检查并is_callable完成工作。

foreach ($array as $func) {
    if (is_callable($func) && $func instanceof Closure) {
        $func();
    }
}

实际上,类检查应该足够了,因为除非创建匿名函数,否则无法手动实例化Closure个对象。

答案 1 :(得分:1)

您可以使用reflection,它有an undocument function to check for closures;试试这个(尚未测试):

foreach ($array as $val) {
    $re = newReflectionFunction($val);
    if ($re->isClosure()) {
        $val();
        // do whatever you want
    }
}

...或检查它是否不是字符串/数字:

foreach ($array as $val) {
    if (!is_string($val) && !is_numeric($val)) {
        $val();
        // do whatever you want
    }
}

...或检查它是否是一个对象:

foreach ($array as $val) {
    if (gettype($val) == 'object') {
        $val();
        // do whatever you want
    }
}

答案 2 :(得分:1)

我认为这就是你想要的。 $result将是每个函数调用的返回值的数组(除非它不是匿名函数,在这种情况下它将是来自$array的原始值)。

$result = array_map(
                    function($e) {
                      return ($e instanceof Closure && is_callable($e)) ?
                        $e() : $e;
                    }, $array);

答案 3 :(得分:0)

onon方法的

gettype返回“object”,is_callable()在函数上返回true,然后:

foreach ($array as $val) {
    if (is_callable($val) && gettype($val)=="object") {
        $val();
    }
}

这是我的测试代码:

<?php 

function look(){
    return "looking";
}

$data=array(
    0 => function() { return "hello"; },
    1 => function() { return "world"; },
    2 => "look",
    3 => function() { return "and";},
    4 => function() { return "listen";}
);
echo "<pre>";

foreach ($data as $val) {
    if (is_callable($val) && gettype($val)=="object") {
        echo $val();
    }
}

?>