Используйте экземпляр объекта на всем сайте с помощью PHP


Как я буду использовать экземпляр объекта, который изначально загружен по всему сайту?

Я хочу, чтобы $myinstance использовался везде.

$myinstance = new TestClass();

Спасибо!

Author: steamboy, 2010-04-28

4 answers

То, что вы ищете, называется одноэлементным шаблоном .

Если вы глубоко разбираетесь в архитектуре ООП и хотите в будущем заниматься такими вещами, как модульное тестирование: Синглеты рассматриваются как несовершенный подход, а не "чистый" в смысле ООП. Я однажды задал вопрос по этому вопросу и получил довольно хорошие результаты с другими, лучшими шаблонами. Много хорошего чтения.

Если вы просто хотите начать с чего-то, и вам нужен доступный класс БД везде просто используйте синглтон.

 6
Author: Pekka 웃, 2017-05-23 12:23:08

Вам просто нужно объявить переменную в глобальной области видимости (например, в начале всего вашего кода), и когда вы хотите использовать ее внутри функции, используйте оператор "global". См. http://php.net/global.

 0
Author: lfagundes, 2010-04-28 18:37:24

Я не на 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']);
       }
 0
Author: nico, 2010-04-28 18:39:50

Существует шаблон проектирования, называемый одноэлементным. Короче говоря:

Измените __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());

Готово

 0
Author: shfx, 2010-04-28 18:41:11