Подтвердить что ты не робот

Любой способ проверить анонимные функции?

Скажем, что у меня есть массив следующим образом:

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

Есть ли способ, которым я могу вызывать 0, 1, 3 и 4 без вызова 2?

4b9b3361

Ответ 1

Анонимные функции - это экземпляры класса Closure. Поэтому проверка этого и is_callable выполняет задание.

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

На самом деле проверка класса должна быть достаточной, поскольку вы не можете создавать объекты Closure вручную, кроме как создавая анонимную функцию.

Ответ 2

Вы можете использовать reflection, у него функция недокумента проверить закрытие; попробуйте (не протестировали):

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
    }
}

Ответ 3

Я думаю, что это то, что вы хотите. $result будет массивом возвращаемого значения каждого вызова функции (кроме случаев, когда это не анонимная функция, в этом случае это будет исходное значение от $array).

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

Ответ 4

gettype on anon methods возвращает "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();
    }
}

?>