【问题标题】:Reassigning $this in PHP/Laravel在 PHP/Laravel 中重新分配 $this
【发布时间】:2015-10-15 08:08:16
【问题描述】:

我有一个扩展了 B 类的 A 类

class A extends B{
    function home(){
        $site = new SitesController($this);
        return $site->home();
    }
}

我希望此类中的每个变量都可以在 SitesController 类中使用。但我不想从 A 扩展 SitesController,因为每次调用它都会重新初始化所有内容,并且会有很多重复的查询调用。 所以我试图在创建类时传递 $this 。但是我不能像这样在 SitesController 中重新初始化 $this。

class SitesController implements SiteInterface
{
    function __construct($data) {
        $this = $data;
    }
}

无论如何我可以完成这项工作吗? 谢谢。

【问题讨论】:

  • 你到底是什么意思:一切都会重新初始化,会有很多重复的查询调用
  • @Daan 在父类B的构造函数中,我有很多数据库查询调用。在 A 类的构造函数中,我调用了 parent::__construct();如果我从类 A 扩展 SitesController,我必须在其构造函数中做同样的事情。查询将在 Class B 的构造函数中调用一次,然后在 SitesControllers 构造函数中调用一次。不是这样吗?不过我不确定。
  • 是的,没错,从你初始化父类的代码中看不到,这就是我问的原因。

标签: php class oop laravel object


【解决方案1】:

您不能“重新分配”$this。

但是您可以将 A 的实例分配为 SitesController 的属性,这意味着您可以从 SitesController 实例中访问 A 的所有公共方法/属性。

class SitesController implements SiteInterface
{
    protected $A;

    public function __construct(A $data) {
        $this->A = $data;
    }

    public function doSomething() {
        return $this->A->publicMethodOfA();
    }
}

这是“依赖注入”,是应用组合原则而不是继承原则

【讨论】:

  • 你有什么特别的原因让$A受保护而不是私有?
  • @Daan - 纯粹是为了方便 SitesController 的任何未来扩展......作为一般原则,我只会在绝对需要私有的情况下将其设为私有
猜你喜欢
  • 1970-01-01
  • 2014-05-26
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
相关资源
最近更新 更多