【问题标题】:Php - Static function of class named ListPhp - 名为 List 的类的静态函数
【发布时间】:2013-05-26 18:58:29
【问题描述】:

我有一个名为 List 的类,这个类有一个静态方法。当我打电话时:

List::method();

出现以下错误:

syntax error, unexpected '::' (T_PAAMAYIM_NEKUDOTAYIM), expecting '('

php 是否认为我想调用原生函数 list()?我必须重命名课程吗?

【问题讨论】:

  • list 是 PHP 保留字......因为你不能有一个与现有函数或构造匹配的类名
  • 赞成的问题,因为它是供未来访问者参考的好问题。
  • @MarkBaker 你当然可以,只需要能够通过命名空间运算符告诉标记器将其视为类名而不是语言结构。我仍然不会推荐这样做,但它肯定可能
  • 好吧,除了命名空间,它是一个保留字。正如 OP 所说的 List 而不是 \List,我想我可以原谅

标签: php list class static


【解决方案1】:

是和不是。 list 不是函数,而是language construct。因此,它是一个“保留字”,这意味着在编译期间分词器将对其进行不同的处理。

编译器希望在语言结构中遵循list 标记,因此它报告时使用(。相反,您将其提供给范围运算符,这意味着它会感到困惑。最简单的解决方案是重命名您的类(无论如何它都过于通用)或防止命名空间冲突,方法是将类 List 放在您自己的命名空间中,或显式引用全局命名空间:

\List::method();

这应该从 PHP 5.3 开始也可以工作 - 它告诉编译器查看全局命名空间,它会在反斜杠后自动期望类名。

【讨论】:

  • 我(再次)遇到了这个问题,并在搜索错误/功能请求等的过程中偶然发现了您的答案。在与 PHP 房间讨论这个问题时,我测试了这段代码。您使用命名空间解析的建议在 5.4 中不起作用。它抛出了预期的错误,Parse error: syntax error, unexpected 'List' (T_LIST), expecting identifier (T_STRING) in ...
  • 你是对的,它在 5.5 中也被破坏了。遗憾的是,构建适当的标记器并不是 PHP 团队中任何人的工作的一部分,因此在一段时间内确实不可能使用过长的保留字列表作为标识符名称。
【解决方案2】:

是的,PHP 尝试调用本机函数
T_PAAMAYIM_NEKUDOTAYIM 表示意外的双冒号,所以当你重命名类时一切都应该没问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 2013-11-22
    • 2014-04-10
    • 2012-04-21
    相关资源
    最近更新 更多