Передача экземпляра объекта в класс

Мне было интересно, как лучше всего передать экземпляр объекта в другой класс для локального использования. Мне также любопытно, если это имеет значение в отношении использования памяти.

Я понял, что в основном есть два пути:

1.) Перенесите экземпляры объектов с помощью ссылки на $ GLOBALS:

class UserLogHandler {
public function __construct() {
$this->DB = $GLOBALS['DB'];
$this->Security = $GLOBALS['Security'];
}
public function doSomeWork() {
$this->DB->someMethod;
}
}

или же
2.) Передача через передачу:

class UserLogHandler($DB,$Security) {
public function doSomeWork() {
$DB->someMethod;
}
}

Мне кажется, что вариант 2 мог бы лучше подходить для сложной среды, хотя я нахожу вариант 1 более привлекательным. В любом случае, я бы предпочел техническое и / или логическое объяснение, почему использовать один вариант над другим. Если есть другой, лучший вариант, пожалуйста, дайте мне знать.

Спасибо заранее и наилучшие пожелания,
Томас

0

Решение

Это действительно хороший вопрос. Я скажу, что это зависит от вашей потребности. Давайте проанализируем оба ваших варианта по одному.

Перед началом работы имейте в виду, что ваш объект всегда должен быть законченным. У него не должно быть неполного состояния. Вы можете обратиться к этой статье для большего понимания https://matthiasnoback.nl/2018/07/objects-should-be-constructed-in-one-go/

1.) Перенесите экземпляры объектов с помощью ссылки на $ GLOBALS:

Вы никогда не должны использовать такие методы, поскольку они сбивают с толку. В $ GLOBALS отсутствует информация о том, где и как была создана конкретная переменная, поэтому вы никогда не можете быть уверены, существует ли эта переменная или что она содержит. Я предложу вам использовать инъекцию зависимостей для этого

use DB;
use Security;

class UserLogHandler
{
public function __construct(DB $DB, Security $Security)
{
$this->DB = $DB;
$this->Security = $Security;
}

public function doSomeWork()
{
$this->DB->someMethod;
}

}

Посмотрите, как теперь вы можете быть уверены в том, откуда $ DB и $ Security, где введены и что они содержат. Вы можете даже принудительно установить тип переменной, используя указание типа, например Security $Security,

Этот метод удобен, когда ваш класс сильно зависит от конкретной переменной. например Класс модели всегда будет нуждаться в адаптере БД, или библиотека генератора PDF будет нуждаться в классе PDF по существу.

2.) Передача через передачу

Это работает, как вы ожидали, но я думаю, что вы допустили ошибку при определении этого. Вы должны написать это следующим образом.

class UserLogHandler
{
public function doSomeWork($DB, $Security)
{
$DB->someMethod;
}
}

Этот метод удобен, когда вам нужна конкретная переменная только в определенной функции. Примером этого будет то, что нам нужно получить записи из модели для какого-то конкретного условия. Таким образом, мы можем передать значение в функцию и получить результаты в соответствии со значением.

use DB;
use Security;

class UserLogHandler
{
public function __construct(DB $DB, $Security)
{
$this->DB = $DB;
$this->Security = $Security;
}

public function doSomeWork($value)
{
if ($value = 'something') {
$this->DB->someMethod;
}
}

}

Как видите, оба метода могут быть использованы в сопряжении. Это зависит только от того, что ваше требование

0

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

Других решений пока нет …

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