PHP类方法名为print ...不允许?

时间:2010-03-05 16:04:31

标签: php

我正在为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?

6 个答案:

答案 0 :(得分:10)

这不起作用,因为print是php中的language construct。我知道它看起来像一个函数,但它的处理方式与(例如)functionwhileinclude等相同。

答案 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)

<print echoisset {{1}}为language constructs,不能用作函数或类名。

答案 4 :(得分:2)

例如,如果您调用print函数'hardcopy()',则可以使用mod-rewrite rule来完成相同的操作。即:

RewriteRule ^ / mycontroller / print / mycontroller / hardcopy [L]

答案 5 :(得分:2)

正如大家所指出的那样,你不能将语言结构用作函数名。

您的解决方案可能是URI Routing,因此您可以在网址中使用print,但可以使用安全的方法名称。