Я относительно новичок в PHP (и в программировании в целом). Запомни.
Вот основной сценарий. Я строю веб-мини-университет.
Есть два ключевых класса: Урок а также LessonSeries.
Оба класса имеют свойство ‘Id’, которое является целым числом и будет уникальным для их класса. Моя база данных гарантирует, что не будет двух Урок или двух Урок-Серий с одинаковым идентификатором.
На многочисленных страницах моего веб-сайта объекты урока повторяются и (если у них есть серии) отображают серии, к которым они принадлежат, а иногда используют некоторые другие методы и свойства LessonSeries.
Итак, вот проблема: Когда урок извлекается из базы данных, он создает серию уроков, соответствующую ему. Но я не хочу, чтобы существовало 20 экземпляров одного и того же LessonSeries. Некоторые методы запускают запрос БД, который необходимо выполнить только один раз для LessonSeries. Это может привести к экспоненциально большей активности дБ, чем необходимо, если бы было 20 экземпляров, по существу, одного и того же ряда.
Я новичок в программировании шаблонов, но вот что я считать Я нуждаюсь:
С учетом сказанного я понятия не имею, как это сделать в 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 не имеет подклассов. И вот где я борюсь.
Вот что вы можете сделать.
Вот псевдокод, демонстрирующий это:
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']);
Других решений пока нет …