将静态父实例与扩展实例值一起使用

时间:2017-10-25 11:32:55

标签: php oop late-static-binding

我有一个主要课程

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值的新实例,因为它是在父类中为空。

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

2 个答案:

答案 0 :(得分:1)

您正试图在运行时解决该课程。 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,因此在运行时您将获得原始基类(实际使用self的类)。通过使用static,您将获得实际运行代码的类。

答案 1 :(得分:1)

在方法中使用static代替self

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

    return $result;
}

通过这种方式,您将获得扩展类的实例(例如Users),但不会获取声明方法的实例(即Database)。