【问题标题】:lower-cased reserved keyword throws an error. Why?小写保留关键字会引发错误。为什么?
【发布时间】:2016-09-14 16:31:06
【问题描述】:

我有这个功能

//admin
$router->route['/admin']->route['default'] = function() { //line 51
    if (isLoggedIn())                                     //line 52
        goTo('CMS');                                      //line 53 <---
    else                                                  //and so on
        goTo('login');  
};

但是我有一个 Parse 错误:语法错误,意外的 '(',在第 53 行的 /path/index.php 中期待 T_STRING
什么是错误?

【问题讨论】:

  • 因为 goto 是 PHP 语言结构,而不是函数:php.net/goto。您不能用自己的版本替换/覆盖语言结构,例如function echo($x) { print($x); } echo('hi mom') 会产生与您完全相同的错误。
  • 但我已经把它装上了驼峰。错误也不同,所以(以我的拙见)这不是问题
  • 所以?只有 php 变量名区分大小写。其他大部分都不是。
  • 这其实很好笑,因为大小写不符
  • 来自文档:Note: Function names are case-insensitive, though it is usually good form to call functions as they appear in their declaration. - php.net/manual/en/functions.user-defined.php

标签: php parse-error


【解决方案1】:

goto 是保留字。您可以覆盖它,无论您如何使用大写/小写变体:

php > function goto() { echo 'foo'; }
PHP Parse error:  syntax error, unexpected 'goto' (T_GOTO), expecting '(' in php shell code on line 1
php > function goTo() { echo 'foo'; }
PHP Parse error:  syntax error, unexpected 'goTo' (T_GOTO), expecting '(' in php shell code on line 1
php > function GOTO() { echo 'foo'; }
PHP Parse error:  syntax error, unexpected 'GOTO' (T_GOTO), expecting '(' in php shell code on line 1

您一开始就不应该定义您的 goTo 函数。

【讨论】:

  • 那么这是否意味着解析器不区分大小写?
  • 仅适用于变量。 $foo$FOO 是完全不同的东西。 function foo()function FOO() 是一样的。
  • 哦,我明白了。对我来说仍然很奇怪。
  • 欢迎使用 PHP,一致性只是白日梦。
  • 用 Java 测试了它,我得到了我期望的结果。我定义了方法DOdODo,即使do 是关键字,一切正常。 :D
【解决方案2】:

您需要重命名goTo()*,例如进入forwardTo(),因为goto被PHP保留:http://php.net/goto

奇怪的是,PHP 并没有警告你。

此外,我建议遵循 PSR 编码标准: http://www.php-fig.org/psr/psr-2/

*@peter-featherstone 的要点:函数名不区分大小写。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多