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

问题描述

| 说我有以下几点:
<?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\'; }
?>
假设正确定义了“ 1”,那么这些方法都不符合我的要求:get_all()抛出“ 2”,因为“ 3”是一个实例变量。 get_all2()抛出
Fatal error: Undefined class constant \'table_name\' in /path/to/foo.PHP on line xx
,因为
self
是静态确定的。 似乎这种事情是继承的全部要点,因此,即使不是很优雅,也应该至少容易做到。 (毕竟这是PHP。) 我该怎么办?     

解决方法

        您需要将
self::table_name
更改为
self::$table_name
-注意美元符号。但是最好的方法是使用PHP 5.3的static关键字: http://php.net/manual/zh/language.oop5.late-static-bindings.php 关键字“ 5”仅引用定义了静态proparty的类,因此在这种情况下是错误的,因为您需要从父类中获取静态属性“继承”。在这种情况下,关键字“静态”将解析正确的呼叫者类别并正常工作。     ,        
self::$table_name
,尽管您可能想要
static::$table_name
。