Передача экземпляра объекта в класс - PullRequest
0 голосов
/ 01 сентября 2018

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

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

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 более привлекательным. В любом случае я бы предпочел техническое и / или логическое объяснение, почему использовать один вариант над другим. Если есть другой, лучший вариант, пожалуйста, дайте мне знать.

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

1 Ответ

0 голосов
/ 01 сентября 2018

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

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

}

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

...