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

quo*_*tor 3 php inheritance class

说我有以下内容:

<?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'; }
?>
Run Code Online (Sandbox Code Playgroud)

假设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.)

什么应该我做?

Tom*_*zyk 5

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

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

self从父类的关键字只引用类的静态proparty的定义,所以它是错误在这种情况下,你需要获得静态属性"继承".在这种情况下,关键字"静态"将解析正确的调用者类并正常工作.