Любой способ проверить анонимные функции?
Скажем, что у меня есть массив следующим образом:
array(
[0] => function() { return "hello"; }
[1] => function() { return "world"; }
[2] => "look"
[3] => function() { return "and";}
[4] => function() { return "listen";}
)
Есть ли способ, которым я могу вызывать 0, 1, 3 и 4 без вызова 2?
Ответы
Ответ 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();
}
}
?>