У меня есть класс InjectedClass с методом SomeMethod. Класс занимает три параметра. Мне нужен вывод метода в другом классе, Мои занятия. По сути, мне нужно передать те же три параметра через конструктор в Мои занятия, к введенному классу для него возвращают некоторые данные.
Проблема в том, что я получаю сообщение о том, что четвертый параметр (внедренный класс) в конструкторе Myclass, как ожидается, будет экземпляром injectedClass, но он пуст! Смотрите пример.
Я думаю, что проблема в том, что 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 нужен только 1 параметр в конструкции — InjectedClass instansce, который готов к работе. То есть
$injected = new Injected($var1, $var2, $var);
$my = new MyClass($injected);
$my->myfunction(); // will work correctly now
Я бы переосмыслил, как вы пытаетесь использовать внедрение зависимостей. Самый простой метод, который я бы выбрал, — создать сеттеры внутри 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
}
}
Конечно, вы могли бы немного это исправить, но, выполнив инъекцию таким образом, вы сможете избежать проблемы, с которой вы сталкиваетесь.
Все зависит от того, чего вы хотите достичь, но в основном в
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
как для Myclass
а также 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($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
,