PHP - Решение проблем с замыканиями и отражениями - PullRequest
0 голосов
/ 04 ноября 2010

Мне нужно было создать динамические крошки, которые должны автоматически реализовываться приложением.Итак, у меня есть следующая структура в URL для навигации: nav = user.listPMs.readPM & args = 5

, тогда у меня может быть файл-функция, единственной целью которого будет определение самой функции user.listPMs.readPM.:

файл: nav / user.listPMs.readPM.php

function readPM($msgId)
{
 /*code here*/
}

Конечно, это приводит к загромождению глобальной области видимости, так как я не заключаю в оболочку функциювнутри класса или с помощью пространств имен.Лучшее решение здесь, кажется, пространство имен, без сомнения, верно?Но я также подумал о другом:

file: nav / user.listPMs.readPM.php

return function($msgId)
{
 /*code here*/
};

Да, этот простой файл просто возвращаетсяанонимная функция.Я думаю, что это удивительно, потому что мне не нужно заботиться о присвоении ему имени - поскольку я уже правильно назвал файл, в котором он содержится, создав пользовательскую функцию и все же назвав ее, казалось бы, просто излишним.Тогда в индексе у меня был бы такой маленький подвох:

file: 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'].

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

1 Ответ

0 голосов
/ 04 ноября 2010

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

...