Мне было интересно, как лучше всего передать экземпляр объекта в другой класс для локального использования. Мне также любопытно, если это имеет значение в отношении использования памяти.
Я понял, что в основном есть два пути:
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 более привлекательным. В любом случае, я бы предпочел техническое и / или логическое объяснение, почему использовать один вариант над другим. Если есть другой, лучший вариант, пожалуйста, дайте мне знать.
Спасибо заранее и наилучшие пожелания,
Томас
Это действительно хороший вопрос. Я скажу, что это зависит от вашей потребности. Давайте проанализируем оба ваших варианта по одному.
Перед началом работы имейте в виду, что ваш объект всегда должен быть законченным. У него не должно быть неполного состояния. Вы можете обратиться к этой статье для большего понимания 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;
}
}
}
Как видите, оба метода могут быть использованы в сопряжении. Это зависит только от того, что ваше требование
Других решений пока нет …