在抽象类的静态函数中创建新实例

arn*_*rno 4 php abstract-class abstraction instantiation

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

我想从抽象父类中定义的静态方法创建类的实例,但PHP告诉我"致命错误:无法实例化抽象类......"我应该如何正确实现它?

编辑:当然我想在这种情况下创建类"user"的实例,而不是抽象类的实例.所以我要告诉它创建一个被调用的子类的实例.

Tom*_*igh 10

请参阅手册中的此页面:

的局限性 self::

对当前类的静态引用类似于self::__CLASS__使用函数所属的类来解析,如在其定义的位置.

使用PHP> = 5.3和后期静态绑定只有一个简单的方法.在PHP 5.3中,这应该工作:

static function get_all_rows() {
        $class = get_called_class();
        while(...) {
            $rows[] = new $class();
            ...
        }
        return $rows;
    }
Run Code Online (Sandbox Code Playgroud)

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


小智 7

这对我有用..

abstract class db_table {

static function get_all_rows() {
    ...
       while(...) {
           $rows[] = new static();
           ...
       }
       return $rows;
    }
}
Run Code Online (Sandbox Code Playgroud)