Альтернатива для eval () -PHP - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь реализовать сопоставление URL в PHP. У меня есть файл json, в котором хранятся URL и функции, которые должны выполняться при запросе этой ссылки. Я использовал eval(), но потом наткнулся на эту

. Помните следующую цитату:

Если ответом является eval (), вы почти наверняка задаете неправильный ответ. вопрос. - Расмус Лердорф, BDFL из PHP

Теперь я думаю, что это любой другой (лучший) способ сделать это.

Мой файл json выглядит следующим образом.

{
    "bw/":"main()",
    "bw/login":"login()"

}

и моя функция loadPage выглядит следующим образом.

function loadPage($url){ //$url = 'bw/'
    $str = file_get_contents('urls.json');
    $this->link = json_decode($str, true);
    $url = ltrim($url,"/");
    $key = $this->link[$url];
    eval("$key;");
}

РЕДАКТИРОВАТЬ: я определил $ this-> ссылку в моем коде

Ответы [ 2 ]

1 голос
/ 02 октября 2019

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

{
    "bw/":"main",
    "bw/login":"login"

}

, а затем вызовите ее, используя .. .

function loadPage($url){ //$url = 'bw/'
    $url = ltrim($url,"/");
    $key = $this->link[$url];
    $key();
}
0 голосов
/ 02 октября 2019

Немного лучший способ изменить eval () на:

if (function_exists($key)) { 
   return $key(); 
} 
return default();

, и вы можете создать функцию "default", чтобы показать ошибку 404 или страницу по умолчанию, когда функция не существует.

...