0

我有一个主要课程

abstract class Database
{
    protected $table;

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

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

然后我使用类的扩展版本:

Users extends Database
{
    protected $table = 'users';
}

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

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

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

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不能在抽象中使用,所以我不得不删除它创建一个没有table值的新实例,因为它在父类中是空的。

任何想法如何使这项工作?

4

2 回答 2

1

您正试图在运行时解决该类。self不会帮你的。你需要使用static它。阅读后期静态绑定

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,因此在运行时您将获得原始基类(self实际使用的类)。通过使用static,您可以获得实际运行代码的类。

于 2017-10-25T11:58:33.210 回答
1

在方法中使用static代替self

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

    return $result;
}

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

于 2017-10-25T12:06:44.283 回答