Мне нужно было создать динамический хлеб, который должен быть реализован автоматически приложением. Таким образом, у меня есть следующая структура в URL для navagation: нав = user.listPMs.readPM & арг = 5PHP - решение проблем с закрытием и отражением
тогда я мог бы иметь функцию-файл, единственной целью которых было бы определить функцию user.listPMs.readPM сам:
файл: нав/user.listPMs.readPM.php
function readPM($msgId)
{
/*code here*/
}
конечно, это заканчивается захламление глобального масштаба, так как я не оберточной функции жгутов класса или с помощью пространств имен. Лучшее решение здесь, похоже, означает, что это пространство имен, без сомнения, верно? Но я также думал о другом:
файл: нав/user.listPMs.readPM.php
return function($msgId)
{
/*code here*/
};
Да, это просто, файл просто возвращая анонимную функцию. Я думаю, что это потрясающе, потому что мне не нужно заботиться о том, чтобы называть его - поскольку я уже правильно назвал файл, который содержит его, создав пользовательскую функцию, и все же иметь его имя будет казаться просто лишним. Тогда в индексе я бы эту маленькую пакость:
файла: index.php
if($closure = @(include 'nav/'.$_GET['nav']))
{
if($closure instanceof Closure)
{
$obj = new ReflectionFunction($closure);
$args = explode(',',@$_GET['args']);
if($obj->getNumberOfParameters($obj)<=count($args))
call_user_func_array($closure,$args);
else
die('Arguments not matching or something...');
} else {
die('Bad call or something...');
}
} else {
die('Bad request etc.');
}
Даже не нужно отметить, что сухари может быть хорошо построен последний раз, анализируя значение в переменной $ _GET ['nav'].
Итак, как вы думаете, есть ли лучшее решение этой проблемы? Вы нашли другой способ исследовать закрытие и/или отражение?
Пожалуйста, не полагайтесь на закрытие, являющееся 'instanceof Closure'. Это внутренняя деталь реализации, и руководство явно просит вас не использовать ее, поскольку она может измениться в будущем. – NikiC
Это правда, я забыл сделать домашнее задание на php.net. Спасибо за предупреждение! Поэтому я буду использовать is_callable ($ замыкание), а не –