【问题标题】:Injecting a class into another class将一个类注入另一个类
【发布时间】:2014-11-14 12:20:24
【问题描述】:

我有一个类 InjectedClass 带有一个方法 someMethod。该类需要三个参数。我需要另一个类中方法的输出,Myclass。基本上,我需要通过 Myclass 中的构造函数将相同的三个参数传递给注入的类,因为它确实返回了一些数据。

问题是我收到一条错误消息,指出 Myclass 构造函数中的第四个参数(注入的类)应该是注入类的实例,但它是空的!请参阅示例。

我认为问题在于 Injected 类在没有参数的情况下被初始化,因此没有初始化,因此是空的。此外,如果我尝试将类直接注入 myfunction 方法,我会得到或多或少相同的结果。我该如何解决这个烂摊子?

class Myclass {

    private $var1;
    private $var2;
    private $var3;
    private $injectedclass;

    public function __construct($var1, $var2, $var3, InjectedClass $injectedclass)
    {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
        $this->injectedclass = $injectedclass;
    }

    public function myfunction()
    {
        return $this->injectedclass($this->var1, $this->var2, $this->var3)->someMethod();
    }
}

class InjectedClass {

    private $var1;
    private $var2;
    private $var3;

    public function __construct($var1, $var2, $var3)
    {
        $this->var1 = $var1;
        $this->var2 = $var2;
        $this->var3 = $var3;
    }

    public function someMethod()
    {
        // do stuff
    }
}

【问题讨论】:

  • 你怎么打电话给Myclass
  • $myclass= new Myclass($var1, $var2, $var3);

标签: php dependency-injection laravel-5


【解决方案1】:

MyClass 在构造中只需要 1 个参数 - InjectedClass 实例,它可以工作了。即

$injected = new Injected($var1, $var2, $var);

$my = new MyClass($injected);

$my->myfunction(); // will work correctly now

【讨论】:

    【解决方案2】:

    我会重新考虑您是如何尝试使用依赖注入的。我想到的最简单的方法是在 InjectedClass 中创建设置器,并在您在构造中设置类变量时设置它们。比如:

    class Myclass {
    
        private $var1;
        private $var2;
        private $var3;
        private $injectedclass;
    
        public function __construct($var1, $var2, $var3, InjectedClass $injectedclass)
        {
            $this->var1 = $var1;
            $this->var2 = $var2;
            $this->var3 = $var3;
            $this->injectedclass = $injectedclass;
            $this->injectedclass->setParams($this->var1, $this->var2, $this->var3);
        }
    
        public function myfunction()
        {
            return $this->injectedclass($this->var1, $this->var2, $this->var3)->someMethod();
        }
    }
    
    class InjectedClass {
    
        private $var1;
        private $var2;
        private $var3;
    
        public function setParams($var1, $var2, $var3) {
            $this->var1 = $var1;
            $this->var2 = $var2;
            $this->var3 = $var3;
        }
    
        public function someMethod()
        {
            // do stuff
        }
    }
    

    当然,您可以稍微清理一下,但通过这种方式进行注入,您应该能够避免您面临的问题。

    【讨论】:

      【解决方案3】:

      一切都取决于你想要达到的目标,但基本上在

      public function myfunction()
      {
         return $this->injectedclass($this->var1, $this->var2, $this->var3)->someMethod();
      }
      

      您不需要传递这些参数,因为$this->injectedclass 已经是已经初始化其属性的对象。所以代码应该是这样的:

      class Myclass {
      
          private $var1;
          private $var2;
          private $var3;
          private $injectedclass;
      
          public function __construct($var1, $var2, $var3, InjectedClass $injectedclass)
          {
              $this->var1 = $var1;
              $this->var2 = $var2;
              $this->var3 = $var3;
              $this->injectedclass = $injectedclass;
          }
      
          public function myfunction()
          {
              return $this->injectedclass->someMethod();
          }
      }
      
      class InjectedClass {
      
          private $var1;
          private $var2;
          private $var3;
      
          public function __construct($var1, $var2, $var3)
          {
              $this->var1 = $var1;
              $this->var2 = $var2;
              $this->var3 = $var3;
          }
      
          public function someMethod()
          {
              // do stuff
              echo $this->var1.' '.$this->var2.' '.$this->var3."<br />";
          }
      }
      
      $m = new Myclass(1,2,3, new InjectedClass(1,2,3));
      $m->myFunction();
      

      但是,当您创建 Myclass 实例时,您需要将参数 1,2,3 传递给 MyclassInjectedClass,如果这些值相同,这可能不太方便。

      因此您可以将代码更改为:

      class Myclass {
      
          private $var1;
          private $var2;
          private $var3;
          private $injectedclass;
      
          public function __construct($var1, $var2, $var3, InjectedClass $injectedclass)
          {
              $this->var1 = $var1;
              $this->var2 = $var2;
              $this->var3 = $var3;
              $this->injectedclass = $injectedclass;
              $this->injectedclass->setParams($var1, $var2, $var3);
          }
      
          public function myfunction()
          {
              return $this->injectedclass->someMethod();
          }
      }
      
      class InjectedClass {
      
          private $var1;
          private $var2;
          private $var3;
      
          public function setParams($var1, $var2, $var3)
          {
              $this->var1 = $var1;
              $this->var2 = $var2;
              $this->var3 = $var3;
          }
      
          public function someMethod()
          {
              // do stuff
              echo $this->var1.' '.$this->var2.' '.$this->var3."<br />";
          }
      }
      
      $m = new Myclass(1,2,3, new InjectedClass());
      $m->myFunction();
      

      因此您只将参数传递给Myclass,并将参数设置为InjectedClass。但是这种方法会导致即使您创建InjectedClass 类的对象,您也需要运行setParams 方法来设置参数,因此它不是最佳解决方案。

      更好的是:

      class Myclass {
      
          private $var1;
          private $var2;
          private $var3;
          private $injectedclass;
      
          public function __construct(InjectedClass $injectedclass)
          {
              $this->injectedclass = $injectedclass;
              list ($this->var1, $this->var2, $this->var3) = $this->injectedclass->getParams();
          }
      
          public function myfunction()
          {
              return $this->injectedclass->someMethod();
          }
      }
      
      class InjectedClass {
      
          private $var1;
          private $var2;
          private $var3;
      
          public function __construct($var1, $var2, $var3)
          {
              $this->var1 = $var1;
              $this->var2 = $var2;
              $this->var3 = $var3;
          }
      
          public function getParams() {
              return array ($this->var1, $this->var2, $this->var3);
          }
      
          public function someMethod()
          {
              // do stuff
              echo $this->var1.' '.$this->var2.' '.$this->var3."<br />";
          }
      }
      
      $m = new Myclass(new InjectedClass(1,2,3));
      $m->myFunction();
      

      InjectedClass 的对象可能会将这些参数返回给Myclass 的对象。

      【讨论】:

        猜你喜欢
        • 2021-12-01
        • 1970-01-01
        • 2018-08-16
        • 1970-01-01
        • 2019-08-03
        • 2020-02-19
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多