Используйте экземпляр объекта на всем сайте с помощью PHP
Как я буду использовать экземпляр объекта, который изначально загружен по всему сайту?
Я хочу, чтобы $myinstance использовался везде.
$myinstance = new TestClass();
Спасибо!
4 answers
То, что вы ищете, называется одноэлементным шаблоном .
Если вы глубоко разбираетесь в архитектуре ООП и хотите в будущем заниматься такими вещами, как модульное тестирование: Синглеты рассматриваются как несовершенный подход, а не "чистый" в смысле ООП. Я однажды задал вопрос по этому вопросу и получил довольно хорошие результаты с другими, лучшими шаблонами. Много хорошего чтения.
Если вы просто хотите начать с чего-то, и вам нужен доступный класс БД везде просто используйте синглтон.
Вам просто нужно объявить переменную в глобальной области видимости (например, в начале всего вашего кода), и когда вы хотите использовать ее внутри функции, используйте оператор "global". См. http://php.net/global.
Я не на 100% уверен, что понял, что вы хотите сделать... но я все равно попытаюсь ответить.
Я думаю, что вы можете сохранить его в переменной сеанса, используя функции сериализации/несериализации для сохранения/извлечения экземпляра вашего класса. Вероятно, вы бы написали тестовый класс как одноэлементный, но это действительно зависит от того, что вы пытаетесь сделать.
Например:
if (!isset($_SESSION["my_class_session_var"])) // The user is visiting for the 1st time
{
$test = new TestClass();
// Do whatever you need to initialise $test...
$_SESSION["my_class_session_var"] = serialize($test);
}
else // Session variable already set. Retrieve it
{
$test = unserialize($_SESSION['my_class_session_var']);
}
Существует шаблон проектирования, называемый одноэлементным. Короче говоря:
Измените __construct и __clone на private, поэтому вызов new TestClass() приведет к ошибке!
Теперь создайте класс, который создаст новый экземпляр вашего объекта или вернет существующий...
Пример:
abstract class Singleton
{
final private function __construct()
{
if(isset(static::$instance)) {
throw new Exception(get_called_class()." already exists.");
}
}
final private function __clone()
{
throw new Exception(get_called_class()." cannot be cloned.");
}
final public static function instance()
{
return isset(static::$instance) ? static::$instance : static::$instance = new static;
}
}
Затем попробуйте расширить этот класс и определить статическую переменную $экземпляра
class TestClass extends Singleton
{
static protected $instance;
// ...
}
Теперь попробуйте следующее:
echo get_class($myinstance = TestClass::instance();
echo get_class($mysecondinstance = TestClass::instance());
Готово