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

时间:2011-06-06 21:38:26

标签: 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::table_name);
    }
}

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

假设query被正确定义,这些方法都不能满足我的要求:get_all()抛出Fatal error: Using $this when not in object context in /path/to/foo.php on line xx因为$this是一个实例变量。

和get_all2()抛出Fatal error: Undefined class constant 'table_name' in /path/to/foo.php on line xx因为self是静态确定的。

似乎这种事情是继承的全部要点,所以如果不是优雅的话,它至少应该是可能的。 (毕竟这是PHP。)

应该我在做什么?

2 个答案:

答案 0 :(得分:5)

您需要将self::table_name更改为self::$table_name - 请注意美元符号。但最好的方法是使用PHP 5.3的静态关键字:

http://php.net/manual/en/language.oop5.late-static-bindings.php

self关键字仅引用静态proparty定义的类,因此在这种情况下它是错误的,因为您需要从父类获取静态属性“inherited”。在这种情况下,关键字“静态”将解析正确的调用者类并正常工作。

答案 1 :(得分:4)

self::$table_name,虽然您可能需要static::$table_name