Переменные в PHP и функции URL - PullRequest
1 голос
/ 17 марта 2009

Вот кусок кода:

$obj = new myClass();
$obj->{$_GET["func"]}($_GET["param"])

Он работает на основе переменных переменных, но я не совсем понимаю, как. Насколько я знаю, переменные переменные используются для таких вещей:

require "dbsettings.php"
$member_id = $_GET['id'];
$db = new DBconnector();
$vars = array('username','passw','email','info','datejoined','dateofbirth');

foreach ($vars as $var) {
  $$var = $db->getUserInfo($member_id,$var);
}
echo $username;
echo $passw;
echo $email;
echo $info;
echo $datejoined;
echo $dateofbirth;

Итак, что происходит в первом куске кода? Кроме того, какую функцию выполняют брекеты? Что они говорят компилятору думать?

Ответы [ 2 ]

10 голосов
/ 17 марта 2009
$obj->{$_GET["func"]}($_GET["param"])

Просто вызывает метод, имя которого хранится в $ _GET ["func"], и передается в качестве параметра $ _GET ["param"].

Скобки служат для устранения неоднозначности имени метода (вы также используете скобки в строках для аналогичных целей, например, echo "calling {$_GET['func']}";

См. Страницу руководства PHP по переменным переменным , чтобы узнать больше, например,

Для того, чтобы использовать переменные переменные с массивами, вы должны разрешить проблема неоднозначности. Это если вы напишите $$a[1] тогда парсер должен знать, если вы хотели использовать $a[1] в качестве переменная, или если вы хотели $$a в качестве переменная, а затем индекс [1] из эта переменная. Синтаксис для Разрешение этой неоднозначности: ${$a[1]} для первого случая и ${$a}[1] для второй.

Записка о безопасности

Поскольку это принятый ответ, я добавлю, что вы не должны так слепо использовать пользовательский ввод, в $ obj могут быть методы, которые вы не хотели бы вызывать.

Вы можете, например, проверить имя метода по массиву разрешенных методов, например,

$method=$_GET["func"];
$ok=in_array($method, array('foo', 'bar', 'frobozz'));

В качестве альтернативы, вы можете разрешить только имена методов, которые следуют определенному шаблону, например с префиксом «ajax»:

$method=$_GET["func"];
$ok=preg_match('/^ajax[A-Za-z]/', $method);

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

$method='ajax'.preg_replace('/[^A-Za-z]/', '', $_GET["func"]);

Существуют и другие способы, но, надеюсь, это иллюстрирует основной принцип: предположим, что ваш злейший враг построил массив $_GET!

1 голос
/ 17 марта 2009

Это в основном вызов функции в зависимости от параметров.

Итак, если вы сделаете запрос, как:

mypage.php?func=prop&param=value

То, что вы получите в результате этого вызова функции:

$obj->prop('value')

Скобки служат для того, чтобы объединить нотацию массива и применить это ["func"] к переменной $ _GET вместо $ obj -> $ _ GET (который может быть допустимым массивом). Если вы не использовали брекеты, то, что вы будете делать, будет похоже на:

($obj->$_GET)["func"](...)

В этом случае обратите внимание, что вы будете запрашивать ключ "func" массива $ obj -> $ _ GET вместо просто $ _GET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...