Используйте экземпляр объекта по всему сайту с PHP - PullRequest
3 голосов
/ 28 апреля 2010

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

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

$myinstance = new TestClass();

Спасибо!

Ответы [ 4 ]

6 голосов
/ 28 апреля 2010

То, что вы ищете, называется singleton pattern.

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

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

0 голосов
/ 28 апреля 2010

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

Измените __construct и __clone на private, поэтому вызов нового 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;
  }
}

Затем попробуйте расширить этот класс и определить статическую переменную $ instance

class TestClass extends Singleton
{
  static protected $instance;


  // ... 
}

Теперь попробуйте это:

echo get_class($myinstance = TestClass::instance();
echo get_class($mysecondinstance = TestClass::instance());

Готово

0 голосов
/ 28 апреля 2010

Я не уверен на 100%, что получил то, что вы хотите сделать ... но я все равно постараюсь ответить.

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

Например:

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 голосов
/ 28 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...