Я пишу контроллер для Codeigniter с помощью метода «print». Имя важно, потому что я хотел бы иметь доступ к странице на странице « http://www.mysite.com/mycontroller/print ».
Однако я не могу этого сделать, потому что есть синтаксическая ошибка:
Parse error: syntax error, unexpected T_PRINT, expecting T_STRING
Есть ли какой-либо специальный синтаксис, чтобы интерпретатор PHP «думал», когда я говорю:
class MyClass extends Controller { function print() { // print method here } }
… что я говорю о методе с именем T_STRING «print», а не T_PRINT, которого он ожидает?
Это не будет работать, потому что print – это языковая конструкция в php. Я знаю, что это похоже на функцию, но она обрабатывается так же, как (например) function
, while
, include
и т. Д.
Я обнаружил, что вы можете обойти ограничение имен для некоторых зарезервированных слов в PHP 5.3
с использованием метода __call
magic.
public function __call( $name, $arguments ) { $fn = 'do_' . $name; if ( method_exists( $this, $fn ) ) { return call_user_func_array( array( $this, fn), $arguments ); } else { throw new Exception( 'Method "' . $name . '" does not exist.' ); } } protected function do_print( /* $arg1, $arg2,...*/ ) { //whatever }
Я не говорю, что это обязательно хорошая идея, но это позволяет вам звонить, как $foo->print()
.
Я действительно не вижу причин, по которым зарезервированные слова не могут использоваться как имена методов для классов. Я не смог придумать двусмысленный случай, который нужно было бы решить.
См. Список зарезервированных ключевых слов в PHP . Вы не можете использовать их как константы, имена классов, имена функций или методов.
print
например echo
или isset
являются языковыми конструкциями и не могут использоваться как функции или имена классов.
Если вы вызывали функцию печати «hardcopy ()», например, вы могли бы использовать правило mod-rewrite для выполнения того же самого. то есть:
RewriteRule ^ / mycontroller / print / mycontroller / hardcopy [L]
Как отмечали все, вы не можете использовать языковые конструкции как имена функций.
Возможно, ваше решение URI Routing так, что вы можете использовать печать в своем URL-адресе, но что-то безопасное, как имя вашего метода.