使用具有扩展实例值的静态父实例

Use static parent instance with extended instance values

我有一个主class

abstract class Database
{
    protected $table;

    public function where(array $params)
    {
        // ...
    }

    public function get()
    {
        // ...
    }
}

然后我使用 class:

的扩展版本
Users extends Database
{
    protected $table = 'users';
}

现在,每当我需要 select 用户时,我只需使用:

$db = new Users();
$results = $db->where(['id' => 1])->get();

这很好用,但我决定专门为 id 请求创建一个静态快捷方式会很好,但我在统计上初始化 class 时遇到问题。 我创建了一个方法 fetch,它应该设置 Id 并使用找到的对象创建 return。

class Database // Had to drop abstract, since self cant be used
{
    protected $table;

    public static function fetch(int $id)
    {
        $self = new self;
        $result = $self->where(['id' => $id])->get();

        return $result;
    }
}

但是,正如我评论的那样,self 不能抽象使用,所以我不得不放弃它 并且 它创建了一个没有 [=16= 的新实例] 值,因为它在父 class.

中是空的

有什么想法可以实现吗?

您正试图在 运行 时解决 class。 self帮不了你。为此,您需要使用 static。继续阅读 late static bindings

class Database // Had to drop abstract, since self cant be used
{
    protected $table;

    public static function fetch(int $id)
    {
        $self = new static;
        $result = $self->where(['id' => $id])->get();

        return $result;
    }
}

由于您使用的是 self,因此在 运行 时您将获得原始基数 class(实际使用 self 的 class ).通过使用 static,您会得到 class,其中代码实际上是 运行。

在方法中使用static代替self:

public static function fetch(int $id)
{
    $self = new static;
    $result = $self->where(['id' => $id])->get();

    return $result;
}

这样您将获得扩展 class 的实例(例如 Users),但不是声明方法的实例(即 Database)。