Я пытаюсь создать свое первое объектно-ориентированное веб-приложение и у меня возник вопрос о том, как глобально ссылаться на объект. Не уверен, если это необходимо или нет, но здесь немного фона. Приложение представляет собой одностраничное приложение.
Index.php создает новый экземпляр класса «Page». Этот экземпляр проверяет параметр url (page = ???), а затем проверяет наличие соответствующего класса содержимого и вызывает внутри него функцию. Если этот класс страницы не существует, он вызывает другой класс 404 и отображает его.
Каждый класс содержимого страницы расширен от класса BasePage. Так например index.php?page=Home
будет работать так
+---------+ +----------+
| | creates instance of Page.php | |
|index.php|----------------------------->| page.php |
| | | |
+---------+ +----------+ +----------+
| | /
| base.php | /
| | / "Page" loads the relevant class
+----------+ / and calls a function within it
home.php | |/_
extends base.php +----------+
| |
| home.php |
| |
+----------+
Надеюсь, это имеет смысл до сих пор. Проблема, с которой я столкнулся сейчас, заключается в том, что мне нужен объект «Пользователь», который создается из экземпляра класса «Пользователь». На этот объект User будут ссылаться почти на каждой странице, Index.php, page.php и home.php. То, что происходило до сих пор, это то, что я создал экземпляры класса User в каждом другом классе. Это работает, но часто приводит к нескольким вызовам базы данных и созданию нескольких объектов пользователя. Я думаю, что лучшим подходом было бы сделать класс User одноэлементным классом, но где я могу создать этот одноэлементный объект. Если я создаю экземпляр в base.php, home.php имеет ссылку на него, а page.php и index.php — нет. Если я создаю экземпляр в index.php, ни одна другая страница не будет иметь к нему доступа, если я не передам его каждому классу — что становится грязным. (Я знаю, я пытался).
Итак, мой вопрос: как сделать одноэлементный объект, доступный для каждой страницы? Я подумал, что это поможет, но а) я не знаю, как это сделать, и б) я прочитал множество статей о том, почему глобальные перемены плохи.
Кто-нибудь может дать совет? Как я должен создавать свой объект User?
Спасибо
Если вы решите попробовать и внедрить синглтон, это будет примером того, как гарантировать, что ваш пользователь всегда один и тот же:
class User {
private static $instance = null;
private $name;
public function __construct($name) {
$this->name = $name;
}
public static function get($name) {
if (self::$instance === null) self::$instance = new self($name);
return self::$instance;
}
public function sayHello() {
echo 'Hello my name is '.$this->name;
}
}
$user = User::get('Bob');
$user->sayHello(); // Hello my name is Bob
Помните, что такие практики подвержены ошибкам, ярости и ненависти, смешивая статические классы и динамические экземпляры.
Если вы хотите узнать о внедрении зависимости, прыщ это было мое знакомство с ним, и, копируя их код, я смог создать гораздо более надежный код; это доступные объекты, созданные с их хорошими зависимостями, где бы вы к ним не обращались.
принцип такого контейнера состоит в том, чтобы определить ваши объекты, а затем извлечь их, сконструированные только те, которые необходимы. Скажем, вы используете прыщ:
$cnt = new Pimple();
$cnt['page'] = function($c) {
// the class pimple passes the container itself to the functions you define
return new page($c['session']);
// defines the page key to return a new page
};
$cnt['session'] = function() {
return new session();
};
$page = $cnt['page'];
// constructs the session because it is called to construct the page
То, что вы ищете, это синглтон. Но шаблон Singleton считается ОЧЕНЬ плохой практикой, и его следует избегать любой ценой. Вы должны стараться избегать любого решения, которое требует от вас глобальных вещей.
Лучшим подходом к очень упрощенной структуре приложения было бы создание некоторого основного класса для вашего приложения и назначение классов компонентов в качестве свойств этому главному классу. Это уже половина пути к хорошему маленькому уколу зависимости.
Несколько небольших статей о том, почему синглтон плох: