$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
!