【问题标题】:Undefined class constant 'self::STRING'未定义的类常量'self::STRING'
【发布时间】:2012-12-13 20:35:35
【问题描述】:

我已经为一个完全奇怪的错误苦苦挣扎了几天: 这是场景(请耐心等待):

我有一个“框架”类,我称之为 F。 我有一些扩展 F 的简单类,我将其中一个称为 P。

所以我有的是:

class F {
    [...]
    protected static $_tabela;
    [...]
    final public static function _Tabela() {
        return static::$_tabela;
    }
    public static function Consultar() {
        echo static::_Tabela();
    }
}

class P extends F {
    protected static $_tabela = 'produtos';
}

当我打电话给P::Consultar(); 时,我收到了这个对我来说毫无意义的错误:

Fatal error: Undefined class constant 'self::STRING' in [...]/F.inc.php on line X

其中 X 是 _Tabela() 方法的主体。

所以,我尝试更改变量名称 ($_tabela)。 我尝试通过 get_call_class() 保存类名:

$class = get_called_class()
return $class::$_tabela;

但是遇到了同样的错误。

另外,错误信息完全没用,我不是在尝试访问类常量,而是访问类静态属性!

谷歌搜索错误消息也没有给我任何有用的结果。

编辑:感谢大家的回答! 我发现了问题,它与我正在查看的代码无关。 原来P类的定义有错误,所以当我尝试调用static::Consultar时,PHP解析了这个类并报错了!

【问题讨论】:

  • 一些你看到这个错误的代码会有帮助
  • 在询问错误时,您应该始终包括完整的错误消息以及有问题的行及其上方的行。
  • 您的代码没有任何意义,您能否发布重要的原始代码部分?
  • 指定您的 PHP 版本,正如@MrSoundless 回答所说,这应该适用于 PHP 5.3 及更高版本。另外......不想问你到底为什么要这样做,但我要说一些理智的话,停止使用静态!
  • 我有一个怀疑。尝试用 self 替换 static,在这种情况下,它应该具有您期望的相同效果,但它应该可以工作。这可能是某个版本中引入的错误,我们可以检查是否有报告,但它适用于 5.3.10。

标签: php class static late-static-binding


【解决方案1】:

如果您使用的是 PHP 版本 >= 5.3.0 ,您可以这样做:

<?php
class F {
    protected static $_tabela = 'a';

    final public static function _Tabela() {
        $s = new static();
        return $s::$_tabela;
    }
    public static function Consultar() {
        $s = new static();
        echo $s::_Tabela();
    }
}

class P extends F {
    protected static $_tabela = 'produtos';
}

echo P::Consultar(); // echos 'produtos'

【讨论】:

    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 2011-04-29
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多