【问题标题】:Use static parent instance with extended instance values使用具有扩展实例值的静态父实例
【发布时间】:2017-10-25 11:32:55
【问题描述】:

我有一个主课

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

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

【问题讨论】:

  • php.net/manual/en/language.oop5.static.php 仅使用(在您的情况下滥用)$self 不会使 fetch 成为静态。
  • “用户”不是特殊类型的“数据库”。此外,通过制作 SQL 包装器,实际上会使代码的安全性降低。此外,应避免使用静态代码,因为它会导致引入紧密耦合。你可能应该查一下data mapper 是什么......你知道,不要让大学难堪。
  • 用户不是数据库。
  • 虽然他的班级组织可能是错误的,但班级实际上被称为Users,而不是用户;所以它至少代表用户的集合,而不是特定的用户实例。无论如何,这不是重点;因为它可以代表 OP 想要的任何东西,所以这是一个意见和辩论的问题;关于类命名和资源命名几乎没有一个学派。
  • @yivi 让事情变得更糟。

标签: php oop late-static-binding


【解决方案1】:

在方法中使用static而不是self

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

    return $result;
}

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

【讨论】:

    【解决方案2】:

    您正试图在运行时解析该类。 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,您可以获得实际运行代码的类。

    【讨论】:

      猜你喜欢
      • 2021-02-19
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多