Как правильно получить доступ к статическим свойствам подклассов в статических методах суперклассов в PHP? - PullRequest
3 голосов
/ 07 июня 2011

Скажем, у меня есть следующее:

<?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 () throws 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 ]

5 голосов
/ 07 июня 2011

Вам нужно изменить self::table_name на self::$table_name - обратите внимание на знак доллара. Но лучший способ - использовать статическое ключевое слово PHP 5.3:

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

Ключевое слово self ссылается только на класс, для которого была определена статическая часть, поэтому в данном случае это неправильно, так как вам нужно получить статическое свойство, «унаследованное» от родительского класса. Ключевое слово «static» в этом случае разрешит правильный класс вызывающего абонента и будет работать правильно.

4 голосов
/ 07 июня 2011

self::$table_name, хотя вы, вероятно, хотите static::$table_name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...