By_Engine
@By_Engine

Есть ли такой паттерн?

К примеру, есть паттерн singleton, который позволяет иметь только одну копию класса.
А есть ли такой паттерн, который позволяет иметь только один объект класса на странице? При создании еще одного объекта этого класса вызывается к примеру distruct()
  • Вопрос задан
  • 354 просмотра
Решения вопроса 1
copist
@copist
Empower people to give
Нельзя вызвать __destruct объекта. Он вызывается автоматически, когда сборщик мусора определяет, что этот объект больше никому не нужен (не осталось ссылок на него)

Если ты скажешь: "Но ...?", отвечу: "А что делать тем, кто этим объектом уже пользуется?"
class SelfDestructible
{
    public $myname;
    function __construct($myname)
    {
        $this->myname = $myname;
    }
}

$a = new SelfDestructible('#1');
// Эта конструция буквально означает следующее: 
// 1. выделить область памяти под объект '#1'
// 2. поместить в переменную $a адрес этой области памяти
// Иначе говоря, в переменной $a хранится указатель на объект

$b = new SelfDestructible('#2');
// Согласно твоей логике, тут должна была бы освободиться память, выделенная ранее под объект '#1'
// но как же поступить с переменной $a, которая всё ещё хранит адрес области памяти этого объекта
// И через переменную $a можно обратиться к той области памяти.
// То есть вломиться в склеп, где лежат останки безвременно погибшего объекта '#1' и бесчестно
// надругаться над ним
// Ни один язык такое кощунство и вандализм не позволит


P.S. поправка под уточнёный вопрос

class SingleSingleton
{
    /**
     * приватный - чтобы никто не делал new SingleSingleton
     */
    private function __construct()
    {
    }

    /**
     * @return static
     */
    public static function getInstance()
    {
        static $instatiated; // признак, что ещё не делали экземпляр класса
        if (is_null($instatiated)) // если ещё не делали экземпляр класса
        {
            $instatiated = true; // пометить, что теперь сделали
            return new SingleSingleton; // вернуть новый объектт
            // метод getInstance может делать new SingleSingleton потому что находится в том же классе
        }
        else // уже был создан объект
        {
            return null; // вернуть ничего
        }
    }
}

// первый получит объект
$a = SingleSingleton::getInstance();
var_dump($a); // -> object(SingleSingleton)#1 {}

// второй получит ничего
$b = SingleSingleton::getInstance();
var_dump($b); // -> NULL

// а сделать new SingleSingleton нельзя
$c = new SingleSingleton; // -> PHP Fatal error
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ashlst
@Ashlst
Фанат эстетики и красивых решений.
Singleton - Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы