我正在为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?
答案 0 :(得分:10)
这不起作用,因为print是php中的language construct。我知道它看起来像一个函数,但它的处理方式与(例如)function
,while
,include
等相同。
答案 1 :(得分:4)
请参阅Reserved Keywords in PHP列表。您不能将它们中的任何一个用作常量,类名,函数或方法名称。
答案 2 :(得分:4)
我发现您可以使用PHP 5.3
魔术方法解决__call
中某些保留字的命名限制。
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()
这样的电话。
我真的认为没有理由为什么保留字不能用作类的方法名称。我无法想出一个需要解决的模棱两可的案例。
答案 3 :(得分:2)
答案 4 :(得分:2)
例如,如果您调用print函数'hardcopy()',则可以使用mod-rewrite rule来完成相同的操作。即:
RewriteRule ^ / mycontroller / print / mycontroller / hardcopy [L]
答案 5 :(得分:2)
正如大家所指出的那样,你不能将语言结构用作函数名。
您的解决方案可能是URI Routing,因此您可以在网址中使用print,但可以使用安全的方法名称。