views:

133

answers:

1
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();

I want to create instances of a class from a static method defined in the abstract parent class but PHP tells me "Fatal error: Cannot instantiate abstract class ..." How should I implement it correctly?

Edit: Of course I want to create instances of the class "user" in this case, not of the abstract class. So I've to tell it to create an instance of the called sub-class.

+3  A: 

See this page in the manual:

Limitations of self::

Static references to the current class like self:: or __CLASS__ are resolved using the class in which the function belongs, as in where it was defined.

There is only an easy way around this using PHP >= 5.3 and late static bindings. In PHP 5.3 this should work:

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

Tom Haigh
Thanks! Worked fine.
arno
Hint: The get_called_class can be emulated in PHP < 5.3 by using this code: http://www.php.net/manual/en/function.get-called-class.php#93799
arno