Php 未定义的类常数';self::STRING';

Php 未定义的类常数';self::STRING';,php,class,static,late-static-binding,Php,Class,Static,Late Static Binding,几天来,我一直在为一个完全奇怪的bug而挣扎: 以下是场景(请耐心听我说): 我有一个“框架”类,我称之为F。 我有一些扩展F的简单类,其中一个我称为P 因此,我得到的是: class F { [...] protected static $_tabela; [...] final public static function _Tabela() { return static::$_tabela; } public static

几天来,我一直在为一个完全奇怪的bug而挣扎: 以下是场景(请耐心听我说):

我有一个“框架”类,我称之为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()我得到了这个对我来说毫无意义的错误:

致命错误:第X行[…]/F.inc.php中未定义的类常量“self::STRING”

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

因此,我尝试更改变量名($\u tabela)。 我尝试通过get_called_class()保存类名:

但也犯了同样的错误

此外,错误消息完全没有用处,我不是试图访问类常量,而是访问类静态属性

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

编辑:谢谢大家的回答! 我发现了问题,它与我正在查看的代码无关。
事实证明P类的定义中有一个错误,所以当我尝试调用static::Consultar时,PHP解析了该类并抱怨了这个错误

如果您使用的是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'

如果您使用的是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'

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