Ссылка на класс PHP - PullRequest
       5

Ссылка на класс PHP

1 голос
/ 25 февраля 2012

Чтобы было ясно, я не хочу создавать один и тот же класс несколько раз. Я хочу создать его экземпляр только один раз и отслеживать любые изменения, внесенные в этот экземпляр, по некоторым ссылкам Возможно ли это, и если да, то как это можно сделать? Спасибо!

Ответы [ 4 ]

3 голосов
/ 25 февраля 2012

Для этого вы можете использовать Singleton pattern . Руководство PHP содержит хороший пример и описание:

Singleton гарантирует, что может быть только один экземпляр класса, и предоставляет глобальную точку доступа к этому экземпляру.

Класс:

<?php
class Example
{
    private static $instance;    
    private function __construct() {
    }

    public static function singleton() {
        if (!isset(self::$instance)) {
            echo 'Creating new instance.';
            $className = __CLASS__;
            self::$instance = new $className;
        }
        return self::$instance;
    }

    public function __clone() {
        trigger_error('Clone is not allowed.', E_USER_ERROR);
    }

    public function __wakeup() {
        trigger_error('Unserializing is not allowed.', E_USER_ERROR);
    }
}

Использование:

$singleton = Example::singleton();

Стоит также отметить следующие возражения против шаблона синглтона из руководства по PHP:

Синглтон-паттерн является одним из наиболее спорных паттернов. Критики утверждают, что Синглтоны вводят Global State в приложение и тесно пара Синглтон и его потребительские классы. Это приводит к скрытому зависимости и неожиданные побочные эффекты, что в свою очередь приводит к коду это сложнее проверить и поддерживать.

Критики также утверждают, что бессмысленно использовать Синглтон в Shared Nothing Архитектура, такая как PHP, где объекты уникальны внутри Запрос только в любом случае. Это проще и чище создавать графы объектов соавтора, используя шаблоны Builders и Factory один раз в начале запроса.

Синглтоны также нарушают некоторые принципы проектирования "SOLID" ООП и закон Деметры. Синглтоны не могут быть сериализованы. Они не могут быть подтипом (до PHP 5.3) и не будет собираться из-за экземпляр хранится как статический атрибут Singleton.

См. Также: Кому нужны синглтоны?

2 голосов
/ 25 февраля 2012

Вы можете создать шаблон Singleton

class Something {
    private static $instance; 

    private function __construct() {

    }

    public static function getInstance() {
          if(Something::$instance == null) {
            Something::$instance = new Something(); 
          }
          return Something::$instance;
    }

    public function someMethod() {
             return "abc";
    }       

}

Когда вы хотите использовать его, вы вызываете Something :: getInstance () -> someMethod ()

Подробнее о синглтоне.

1 голос
/ 25 февраля 2012

Чтобы было ясно, я не хочу создавать один и тот же класс несколько раз. Я хочу создать его экземпляр только один раз и отслеживать любые изменения, внесенные в этот экземпляр, по некоторым ссылкам Возможно ли это, и если да, то как это можно сделать? Спасибо!

Конечно, это возможно. Вы можете сделать это буквально:

Прежде всего, поскольку вы не хотите создавать экземпляр класса несколько раз, просто создайте его один раз:

$instance = new Class();

Затем вы хотите отслеживать изменения, внесенные в этот экземпляр. Я не знаю точно, что вы имеете в виду. Вероятно, вы хотите сохранить только один экземпляр. Вы просто можете сделать это, так как вы создали только один раз, вы можете обратиться к этому экземпляру с помощью переменной $instance.

Кроме того, вы можете "ссылаться" на $instance также и на некоторые другие переменные:

$reference = $instance;

Теперь вы можете получить доступ к единственному экземпляру Class с помощью переменной $instance и $reference.

Если вам нужно контролировать экземпляр, я предлагаю вам создать Decorator , который выполняет эту работу:

$decorator = new ClassDecorator(new Class());

Затем декоратор может работать как перехватчик, прежде чем что-либо достигнет Class.

Чтобы узнать, изменилось ли внутреннее состояние класса, вы также можете использовать функции serialize и unserialize:

$instance = new Class();
$snapshot = serialize($instance);

...
# more code, $instance is changed or not, we don't know
...

$changed = $snapshot != serialize($instance);

Надеюсь, это полезно.

0 голосов
/ 25 февраля 2012

То, что вы пытаетесь сделать, называется синглтон-паттерном. См. http://en.wikipedia.org/wiki/Singleton_pattern

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