Как я могу создать экземпляр зависимости для класса от каждого вызова функции из этого класса? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть класс Helpers, набор полезных функций без побочных эффектов, этот объект также зависит от Scrapper. Проблема в том, что, если я передам этот объект через конструктор:

public function __constructor( $scrapper )
{
    this->scrapper = $scrapper;
}
...
new Helpers( new Scrapper);

Каждая функция, которая использует (Obj:Scrapper) $this->scrapper таким образом, как $this->scrapper->functionCallHere, будет совершать вызовы объекта scrapper, который у MAYBE был свой набор состояния (внутренние переменные) другими вызовами функций в прошлом.

Давайте посмотрим, что произойдет, если Helpers имеет две функции, которые обе зависят от Scrapper:

public function getImages()
{
    //maybe some logic.
    return $this->scrapper->getImages();
}

И предположим, что мы только что назвали getImages, теперь наш $scrapper объект изменил свое внутреннее состояние. Предположим, что мы затем вызываем следующую функцию getComments:

public function getComments()
{
    //maybe some logic.
    return $this->scrapper->getComments();
}

... она будет использовать старый $scrapper и его состояние. В моем случае это очень, очень плохо, потому что я использую внешний пакет, который сохраняет в своем внутреннем состоянии довольно много данных о HTTP-запросах, пользовательских сеансах и т. Д. c., Поэтому случаи, когда я пытаюсь getComments, но с параметрами, которые установлены getImages, обязательно произойдут.

Как я могу заставить каждый вызов функции использовать новый экземпляр этого объекта-скребка без жесткого кодирования создания объекта в каждой функции, такого, чтобы зависимости не понятны? Я не хочу в конечном итоге засорять мой код этим. Короче говоря, как я могу чисто создать «зависимости функций»?

Буду честен. У меня эта проблема пахнет classi c «если у вас есть эта проблема, вы, безусловно, пытаетесь сделать что-то не то».

1 Ответ

0 голосов
/ 03 февраля 2020

Я заметил, что вы делаете $this->scrapper->whatever(), так почему бы просто не сделать $this->getScrapper()->whatever(), где функция getScrapper() возвращает новый экземпляр объекта-скребка?

Вы можете сделать свои вспомогательные функции stati c тогда, как кто-то другой предложил:

<?php

class Helpers {
   public static function getScrapper () {
      return new Scrapper();
   }

   public static function getImages () {
      $scrapper = static::getScrapper();
      // logic
      return $scrapper->getImages();
   }
}

Или, в зависимости от того, что именно вы делаете, вам может понадобиться клонировать скребок всякий раз, когда метод в вашем классе помощников должен его использовать:

<?php

class Helpers {
   private $scrapper;
   public function __construct ($scrapper) {
      $this->scrapper = $scrapper;
   }
   public function getScrapper () {
      return clone $this->scrapper;
   }
   public function getImages () {
      $scrapper = $this->getScrapper();
      // logic - not sure if this modifies $scrapper
      return $scrapper->getImages();
   }
}

Последнее решение кажется немного хакерским

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...