2010-11-04 3 views
0

Мне нужно было создать динамический хлеб, который должен быть реализован автоматически приложением. Таким образом, у меня есть следующая структура в 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'].

Итак, как вы думаете, есть ли лучшее решение этой проблемы? Вы нашли другой способ исследовать закрытие и/или отражение?

+0

Пожалуйста, не полагайтесь на закрытие, являющееся 'instanceof Closure'. Это внутренняя деталь реализации, и руководство явно просит вас не использовать ее, поскольку она может измениться в будущем. – NikiC

+0

Это правда, я забыл сделать домашнее задание на php.net. Спасибо за предупреждение! Поэтому я буду использовать is_callable ($ замыкание), а не –

ответ

0

Мне нравится основная идея. Но реализация довольно ужасная. Представьте, что я установил nav=../../../../../../etc/passwd. Это (в зависимости от конфигурации вашего сервера) позволит мне получить доступ к вашему файлу паролей, что, безусловно, не очень хорошо.

+0

, конечно, это всего лишь образец, а не полная реализация, у меня должна быть проверка безопасности внизу. –

+0

Erm, я надеюсь, что на _top_ (прежде чем включать сырые файлы, которые в PHP будут отправлять их прямо на STDOUT/пользователь). – Wrikken

+0

Да, извините, я имел в виду в своем скрипте index.php –

Смежные вопросы