Intereting Posts

Метод класса PHP с именем print … не разрешен?

Я пишу контроллер для 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-адресе, но что-то безопасное, как имя вашего метода.