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

发布于 2024-09-02 09:31:41 字数 410 浏览 8 评论 0原文

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 告诉我“致命错误:无法实例化抽象类...”我应该如何正确实现它?

编辑:当然,在这种情况下我想创建“user”类的实例,而不是抽象类的实例。所以我必须告诉它创建被调用子类的实例。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

倾城月光淡如水﹏ 2024-09-09 09:31:41

请参阅手册中的此页面

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-used-class.php

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

通知家属抬走 2024-09-09 09:31:41

这对我来说工作..

abstract class db_table {

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

this work for me..

abstract class db_table {

static function get_all_rows() {
    ...
       while(...) {
           $rows[] = new static();
           ...
       }
       return $rows;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文