D
D
Dmitry2015-10-08 19:32:55
PHP
Dmitry, 2015-10-08 19:32:55

Is there such a pattern?

For example, there is the singleton pattern, which allows you to have only one copy of a class.
Is there a pattern that allows you to have only one class object per page? When creating another object of this class, for example, distruct() is called

Answer the question

In order to leave comments, you need to log in

2 answer(s)
P
Pavel Volintsev, 2015-10-08
@By_Engine

You cannot call __destruct on an object. It is called automatically when the garbage collector determines that this object is no longer needed by anyone (there are no references to it left).
If you say: "But ...?", I will answer: "What about those who already use this object?"

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' и бесчестно
// надругаться над ним
// Ни один язык такое кощунство и вандализм не позволит

PS correction for clarified question
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

A
Andrew, 2015-10-08
@Ashlst

Singleton - Ensures that the class has only one instance and provides a global access point to it.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question