PHP: иерархия классов со статическими членами - PullRequest
0 голосов
/ 17 апреля 2011

У меня есть система, над которой я работаю:

abstract class Model {
    static $table = "";
    abstract static function init();

    public static function getById() {
        $table = self::$table;
    }
}

class Model_user extends Model {
    static function init() {
        self::$table = "users";
    }
}

class Model_post extends Model {
    static function init() { self::$table = "post"; }
}

// ...

Model_user::init();
Model_post::init();
$user = Model_user::getById(10);
$post = Model_user::getById(40);

Я хочу, чтобы это было так, чтобы у каждого подкласса был свой набор статических членов, к которым могут обращаться статические функции в Model.Я не могу использовать ключевое слово static ::, потому что мне нужно использовать PHP 5.2.16.К сожалению, я не могу просто сказать «self ::» из-за проблемы с PHP, показанной в следующем примере:

class Foo {
    static $name = "Foo";

    static function printName() {
        echo self::$name;
    }
}

class Bar extends Foo {
    static $name = "Bar";
}

class Foobar extends Foo {
    static $name = "Foobar";
}

Bar::printName();
echo "<br />";
Foobar::printName();

, который отображает:

Foo<br />Foo

Когда он должен отображаться:

Bar<br />Foobar

Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 17 апреля 2011

Кажется, вы не можете получить доступ к статическим членам дочерних классов в коде статического метода родителя. Решение было опубликовано в этом комментарии к документации php о статическом ключевом слове . Решением было бы сделать вашу табличную переменную массивом этой формы:

$table = array ('classname' => 'tablename', 'secondClassname' => 'secondTablename');
0 голосов
/ 17 апреля 2011

Все, что является статическим, принадлежит классу, а не объекту. Поэтому статические методы не наследуются от родительского класса и будут обращаться только к членам внутри класса, в котором они определены.

В Java такого рода вызов статического метода (Foobar::printName()) даже выдавал бы ошибку.

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