Создать новый экземпляр в статической функции абстрактного класса - PullRequest
4 голосов
/ 20 мая 2010
abstract class db_table {

    static function get_all_rows() {
        ...
        while(...) {
            $rows[] = new self();
            ...
        }
        return $rows;
    }
}

class user extends db_table {

}

$rows = user::get_all_rows();

Я хочу создать экземпляры класса из статического метода, определенного в абстрактном родительском классе, но PHP говорит мне «Неустранимая ошибка: не удается создать экземпляр абстрактного класса ...» Как мне правильно его реализовать?

Редактировать: Конечно, я хочу создать экземпляры класса "пользователь" в этом случае, а не абстрактного класса.Поэтому я должен сказать ему создать экземпляр вызываемого подкласса.

Ответы [ 2 ]

10 голосов
/ 20 мая 2010

См. эту страницу в руководстве:

Ограничения self::

Статические ссылки на текущий класс как self:: или __CLASS__ разрешены используя класс, в котором функция принадлежит, как и в том месте, где оно было определено.

Существует только простой способ обойти это, используя PHP> = 5.3 и поздние статические привязки. В PHP 5.3 это должно работать:

static function get_all_rows() {
        $class = get_called_class();
        while(...) {
            $rows[] = new $class();
            ...
        }
        return $rows;
    }

http://php.net/manual/en/function.get-called-class.php

3 голосов
/ 14 февраля 2016

эта работа для меня ..

abstract class db_table {

static function get_all_rows() {
    ...
       while(...) {
           $rows[] = new static();
           ...
       }
       return $rows;
    }
}
...