Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我们可以用类作为依赖注入而不是接口吗_Php_Oop_Dependency Injection - Fatal编程技术网

Php 我们可以用类作为依赖注入而不是接口吗

Php 我们可以用类作为依赖注入而不是接口吗,php,oop,dependency-injection,Php,Oop,Dependency Injection,我使用了另一个类作为依赖项注入,这是解决问题的好方法还是我搞乱了OOP方法 Helper.php class Helper { public function getModulePermission($role_id, $module, $type) { // my work code } } use App\Helpers\Helper; class DesignationController extends Controller { prot

我使用了另一个类作为依赖项注入,这是解决问题的好方法还是我搞乱了OOP方法

Helper.php

class Helper {

    public function getModulePermission($role_id, $module, $type) {
        // my work code
    }

}
use App\Helpers\Helper;

class DesignationController extends Controller {

    protected $designation;
    protected $helper;

    /**
     * @param DesignationContract $designation
     * @param Helper $helper
     */
    public function __construct(DesignationContract $designation, Helper $helper) {
        $this->designation = $designation;
        $this->helper = $helper;
    }

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index(Request $request) {
        $permission = $this->helper->getModulePermission($request->id, 'Designation', 'view');      
        if ($permission) {
            return true;
        } else {
            return view('errors.forbidden');
        }
    }
DesignationController.php

class Helper {

    public function getModulePermission($role_id, $module, $type) {
        // my work code
    }

}
use App\Helpers\Helper;

class DesignationController extends Controller {

    protected $designation;
    protected $helper;

    /**
     * @param DesignationContract $designation
     * @param Helper $helper
     */
    public function __construct(DesignationContract $designation, Helper $helper) {
        $this->designation = $designation;
        $this->helper = $helper;
    }

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index(Request $request) {
        $permission = $this->helper->getModulePermission($request->id, 'Designation', 'view');      
        if ($permission) {
            return true;
        } else {
            return view('errors.forbidden');
        }
    }
因此,我有一个名为
Helper
的类,可以在每个控制器中访问该类以检查权限,但我认为我把这里的OOP功能搞砸了。像这样工作好吗,或者我需要创建一个
接口而不是类
  • 这是两个不同的OOP概念。接口强制实现它的类实现接口中声明的函数(称为函数签名)。因此,对于实现同一接口的多个类,您最终将看到多个类实现同一组函数(不管它是否是同一个函数体)
  • 第二个概念称为依赖注入,在某些情况下称为控制反转。您可以通过类构造函数或setters注入类,并调用注入类提供的特定函数。在这里,您将拥有由多个类调用的相同函数,这有利于通过使用公共(注入)类减少修改,更容易进行单元测试(您可以轻松地模拟对象),更模块化的代码(如果您想要不同的功能,您可以注入不同的类)
因此,目前的情况已经足够好了,但这完全取决于你想做的事情。

  • 这是两个不同的OOP概念。接口强制实现它的类实现接口中声明的函数(称为函数签名)。因此,对于实现同一接口的多个类,您最终将看到多个类实现同一组函数(不管它是否是同一个函数体)
  • 第二个概念称为依赖注入,在某些情况下称为控制反转。您可以通过类构造函数或setters注入类,并调用注入类提供的特定函数。在这里,您将拥有由多个类调用的相同函数,这有利于通过使用公共(注入)类减少修改,更容易进行单元测试(您可以轻松地模拟对象),更模块化的代码(如果您想要不同的功能,您可以注入不同的类)

因此,目前的情况已经足够好了,但这完全取决于您想做什么,如上所述。

我不喜欢这个名称,它对我来说毫无意义,或者让我知道这个类可以帮助我获得模块的权限。此外,有了这样一个名称,你可以简单地使用另一种方法,比如说
Helper::login($id)
,或者你命名它,这将立即打破单一责任原则(laravel控制器无论如何都会这样做)


注入相对来说还可以,也许中间件类更适合这样做。

我不喜欢这个名称,它对我来说毫无意义,或者让我觉得这个类可以帮助我获得模块的权限。此外,有了这样一个名称,你可以简单地使用另一种方法,比如说
Helper::login($id)
,或者你命名它,这将立即打破单一责任原则(laravel控制器无论如何都会这样做)


注入相对来说还可以,也许中间件类更适合这样做。

错了<代码>DI!==国际奥委会
。DI是实现国际奥委会的一种方式。不,这没有错!“在软件工程中,依赖项注入是一种软件设计模式,用于实现控制反转以解决依赖项。”有关更多信息,请参阅:)确切地说,学习阅读您的wiki文章:)IoC是一项原则,是一项坚实的原则。DI是一种技术或模式,可以帮助您实现它。IoC和DI都是模式。DI是IoC的一种专门化,这意味着DI继承了IoC,但有一些细微的变化,使其有所不同。您可能知道,在继承中,子类与父类是同一类型的。@AngelIliikov IoC不是一个原则,而是一个实现,它与SOLID无关。wiki中的术语是相关的,但与依赖项倒置原则不同<代码>DI!==国际奥委会。DI是实现国际奥委会的一种方式。不,这没有错!“在软件工程中,依赖项注入是一种软件设计模式,用于实现控制反转以解决依赖项。”有关更多信息,请参阅:)确切地说,学习阅读您的wiki文章:)IoC是一项原则,是一项坚实的原则。DI是一种技术或模式,可以帮助您实现它。IoC和DI都是模式。DI是IoC的一种专门化,这意味着DI继承了IoC,但有一些细微的变化,使其有所不同。您可能知道,在继承中,子类与父类是同一类型的。@AngelIliikov IoC不是一个原则,而是一个实现,它与SOLID无关。wiki中的术语是相关的,但与依赖项倒置原则不同。是的,我将把这个名称改为
PermissionHelper
,但是你能提供一个中间件的例子吗这里是laravel文档:,我认为这是非常不言自明的。是的,我将把这个名称改为
PermissionHelper
,但是你能提供一个中间件的例子吗?这里是laravel文档:,我认为这是非常不言自明的。DI对我来说很好。但是,您可能希望了解php编码标准:。你很好,他看起来很好。但是,您可能希望了解php编码标准:。不客气