Как я могу ограничить экземпляры классов в PHP?

Я относительно новичок в PHP (и в программировании в целом). Запомни.

Вот основной сценарий. Я строю веб-мини-университет.

Есть два ключевых класса: Урок а также LessonSeries.

  • Урок имеет свойство Series, в котором хранится единичный LessonSeries если этот урок принадлежит к серии. Может и нет.
  • LessonSeries имеет свойство Lessons, которое будет содержать массив объектов Lesson.

Оба класса имеют свойство ‘Id’, которое является целым числом и будет уникальным для их класса. Моя база данных гарантирует, что не будет двух Урок или двух Урок-Серий с одинаковым идентификатором.

На многочисленных страницах моего веб-сайта объекты урока повторяются и (если у них есть серии) отображают серии, к которым они принадлежат, а иногда используют некоторые другие методы и свойства LessonSeries.

Итак, вот проблема: Когда урок извлекается из базы данных, он создает серию уроков, соответствующую ему. Но я не хочу, чтобы существовало 20 экземпляров одного и того же LessonSeries. Некоторые методы запускают запрос БД, который необходимо выполнить только один раз для LessonSeries. Это может привести к экспоненциально большей активности дБ, чем необходимо, если бы было 20 экземпляров, по существу, одного и того же ряда.

Я новичок в программировании шаблонов, но вот что я считать Я нуждаюсь:

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

С учетом сказанного я понятия не имею, как это сделать в PHP.

Редактировать:
В комментариях было указано, что мне нужно продемонстрировать, что я пытался решить эту проблему, чтобы это было своего рода хорошим вопросом для SO. Но это именно моя проблема.

Я подумал сделать что-то вроде этого:

class LessonSeries {

private static $registry;

public $Id;
public $SeriesName;
public $ImagePath;
public $Description;
private $index;
private $lessons;
private $lessonCount;

public function __construct($seriesName, $imagePath=null, $Id=null, $description = null) {
if(isset(self::$registry[$id])){
return self::$registry[$Id];
}else{
$this->SeriesName = $seriesName;
$this->ImagePath = $imagePath;
$this->Id = $Id;
$this->Description = $description;
self::$registry[$Id] = $this;
}
}

Однако я не думаю, что так работают конструкторы php. Я думаю, что я знаю, как делать то, что я хочу в Python (используя подклассы и тому подобное), но PHP не имеет подклассов. И вот где я борюсь.

0

Решение

Вот что вы можете сделать.

  1. Создать заводской объект. Переместите туда всю логику создания / кэширования.
  2. Передайте эту фабрику вновь созданным урокам и сериям, чтобы они могли делегировать создание.
  3. В коде вашей страницы начните с создания фабрики.
  4. Старайтесь избегать статики, если можете. Например, ваш код будет проще для модульного тестирования, если это реальные объекты.

Вот псевдокод, демонстрирующий это:

class LessonsFactory {
private $lessons = [];
private $series = [];

public getLesson($id) {
if (isset($this->lessons[$id])) {
return $this->lessons[$id];
}
$lesson = $this->loadLesson($id);
$this->lessons[$id] = $lesson;
$this->getSeries($lesson[$id]);
}

private loadLesson($id) {
$data = ... // load lesson from db
return new Lesson($data, $this);
}

public getSeries($id) {
if (isset($this->series[$id])) {
return $this->series[$id];
}
$series = $this->loadSeries($id);
$this->series[$id] = $series;
}

private loadSeries($id) {
$data = ... // load series from db
return new LessonSeries($data, $this);
}
}class Lesson {
private $factory;

public function __construct($data, LessonFactory $factory) {
$this->factory = $factory;

// + code to intialize object with $data
}

// this is how you get series from lessons
public function getSeries() {
return $this->factory->getSeries($this->seriesId);
}
}

// somewhere in your page controller code
$factory = new LessonsFactory();
$lesson = $factory->getLesson($_GET['lessond_id']);
1

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

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

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