什么';在PHP的超类静态方法中,访问子类静态属性的正确方法是什么?

什么';在PHP的超类静态方法中,访问子类静态属性的正确方法是什么?,php,class,inheritance,Php,Class,Inheritance,假设我有以下几点: <?php abstract class MyParent { public static $table_name; public static get_all(){ return query("SELECT * FROM {$this->table_name}"); } public static get_all2(){ return query("SELECT * FROM ".self::t

假设我有以下几点:

<?php
abstract class MyParent
{
    public static $table_name;

    public static get_all(){
        return query("SELECT * FROM {$this->table_name}");
    }

    public static get_all2(){
        return query("SELECT * FROM ".self::table_name);
    }
}

class Child extends MyParent
{   public static $table_name = 'child'; }
?>

假设
query
定义正确,这两种方法都不能满足我的要求:get_all()抛出
致命错误:在xx行的/path/to/foo.php的对象上下文中使用$this,因为
$this
是一个实例变量

get_all2()抛出致命错误:第xx行的/path/to/foo.php中未定义的类常量“table_name”,因为
self
是静态确定的

这类事情似乎是继承的全部意义,所以它至少应该是可能的,即使不是优雅的。(这毕竟是PHP。)


我应该怎么做?

虽然您可能想要
静态::$table\u name
,但您需要将
self::table\u name

更改为
self:$table\u name
-注意美元符号。但最好的方法是使用PHP 5.3的静态关键字:


self
关键字只引用定义了静态属性的类,因此在这种情况下是错误的,因为您需要从父类获取静态属性“继承”。在本例中,关键字“static”将解析正确的调用方类并正确工作。

static::$table\u name正是我想要的,self:$table\u name做了错误的事情。该死,这不是static的意思!这是动态类级绑定。PHP遵循Java的例子,使用愚蠢的关键字表示类级变量,这一事实不应该影响其语言的所有其他部分。这也是statis在PHP中的含义。这就是为什么我在PHP手册上放了一个链接——只是为了确保人们不会把它当作通常的静态。它用词不当,因为它与
静态
函数或属性无关。i、 例如,
static::foo()
可以是对静态函数或非静态函数的调用。手册上说它是以“内部视角”命名的,但这真的只是一个蹩脚的借口。对不起,托马斯,我没有批评你,我应该以“谢谢”而不是“该死”开始评论。这真的没关系,只要我们讨论技术细节,而不是对其他人指名道姓。:)如果您对我的回答感到满意,我们将不胜感激。:)为什么这两个答案都是从说
self::$table\u name
开始的,而这不起作用?奇怪的至少他们最终说要使用后期静态绑定。