Внедрение класса в другой класс

У меня есть класс 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
}
}

0

Решение

MyClass нужен только 1 параметр в конструкции — InjectedClass instansce, который готов к работе. То есть

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

$my = new MyClass($injected);

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

Другие решения

Я бы переосмыслил, как вы пытаетесь использовать внедрение зависимостей. Самый простой метод, который я бы выбрал, — создать сеттеры внутри 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
}
}

Конечно, вы могли бы немного это исправить, но, выполнив инъекцию таким образом, вы сможете избежать проблемы, с которой вы сталкиваетесь.

0

Все зависит от того, чего вы хотите достичь, но в основном в

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,

0
По вопросам рекламы [email protected]