Php 哪一个更好:在对象上操作,还是在注入依赖项的对象内操作?

Php 哪一个更好:在对象上操作,还是在注入依赖项的对象内操作?,php,oop,laravel,dependency-injection,solid-principles,Php,Oop,Laravel,Dependency Injection,Solid Principles,我一直在努力重构我不久前编写的一些代码,使之更干净、更易于测试。我可能在这里吹毛求疵,但对于下面的场景,我想知道哪种方法更好,为什么 所以我有一个观察者观察我的应用程序模型创建的事件,然后执行一些初始化。在一个场景中,我可以直接调用我的初始值设定项,在另一个场景中,我可以在我的模型上调用initialize并传入一个初始值设定项对象 观察者:AppObserver.php class AppObserver { private $appInitializer; public f

我一直在努力重构我不久前编写的一些代码,使之更干净、更易于测试。我可能在这里吹毛求疵,但对于下面的场景,我想知道哪种方法更好,为什么

所以我有一个观察者观察我的应用程序模型创建的事件,然后执行一些初始化。在一个场景中,我可以直接调用我的初始值设定项,在另一个场景中,我可以在我的模型上调用initialize并传入一个初始值设定项对象

观察者:AppObserver.php

class AppObserver {
    private $appInitializer;

    public function __construct(InitializerInterface $appInitializer){
        $this->appInitializer = $appInitializer;
    }

    public function created($app) {
        // option 1
        $this->appInitializer->initialize($app);

        // option 2
        $app->initialize($this->appInitializer);
    }
}
class App {
    ...
    // option 2
    public function initialize(InitializerInterface $initializer){
        $initializer->initialize($this);
    }
    ...
}
class AppInitializer implements InitializerInterface {
    ...
    public function initialize($app){

        $this->generateIdHash();
        $this->generateSecretKey();
        $this->setPlatformVersion();
    }
    ...
}
模型:App.php

class AppObserver {
    private $appInitializer;

    public function __construct(InitializerInterface $appInitializer){
        $this->appInitializer = $appInitializer;
    }

    public function created($app) {
        // option 1
        $this->appInitializer->initialize($app);

        // option 2
        $app->initialize($this->appInitializer);
    }
}
class App {
    ...
    // option 2
    public function initialize(InitializerInterface $initializer){
        $initializer->initialize($this);
    }
    ...
}
class AppInitializer implements InitializerInterface {
    ...
    public function initialize($app){

        $this->generateIdHash();
        $this->generateSecretKey();
        $this->setPlatformVersion();
    }
    ...
}
初始值设定项:AppInitializer.php

class AppObserver {
    private $appInitializer;

    public function __construct(InitializerInterface $appInitializer){
        $this->appInitializer = $appInitializer;
    }

    public function created($app) {
        // option 1
        $this->appInitializer->initialize($app);

        // option 2
        $app->initialize($this->appInitializer);
    }
}
class App {
    ...
    // option 2
    public function initialize(InitializerInterface $initializer){
        $initializer->initialize($this);
    }
    ...
}
class AppInitializer implements InitializerInterface {
    ...
    public function initialize($app){

        $this->generateIdHash();
        $this->generateSecretKey();
        $this->setPlatformVersion();
    }
    ...
}
我倾向于选项2,因为它允许我做初始化依赖项不能做的其他事情


我非常感谢您提供的任何反馈和/或任何建议。

如果您正在构建核心业务类,我建议保持其独立性

如果您正在构建实用程序或帮助程序类,我建议使用依赖注入方法,让实用程序类在该对象上执行其“实用”功能


根据您的示例代码,您的观察者似乎(在我看来)提供的更多的是实用功能,而不是核心业务功能,因此我推荐依赖注入路线。

选项2具有双向依赖性。初始值设定项必须知道两个选项中的应用程序,但在选项2中,应用程序必须知道初始值设定项。虽然您使用了一个接口,但它并没有那么糟糕

但从表面上看,如果没有任何其他信息或要求,我会选择选项1作为更清洁的选项


你说选项2允许你做更多的事情,这可能是真的,但我会等着看你还需要它做什么

关于双向依赖性的观点非常好。谢谢你的反馈!