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