demiurg (demiurg) wrote,
demiurg
demiurg

причём тут Синглтон?

Singleton::getInstance -- это метод класса.
этот метод нужно было определять в каждом классе, который хотелось бы сделать Одиночкой.

теперь же, ценой совсем небольшого геморроя, определяем маленький класс Синглтон, а потом наследуем от него что-угодно:

<?php

class Singleton 
{
    private static 
$instances = array();

    protected function 
__construct()
    {
        echo 
__METHOD__."\n";
    }

    public static function 
__callStatic($method$params)
    {
        switch(
$method)
        {
            case 
'getinstance':
                
$className get_called_class();
                if(!isset(
self::$instances[$className])) self::$instances[$className] = new $className;
                return 
self::$instances[$className];
        }
    }
}

class 
Chained extends Singleton
{
    protected function 
__construct()
    {
        
parent::__construct();
        echo 
__METHOD__."\n";
    }
}

class 
Chained2 extends Chained
{
    protected function 
__construct()
    {
        echo 
__METHOD__."\n";
    }
}

$c Chained::getInstance();
$c1 Chained::getInstance();

$d Chained2::getInstance();
$d1 Chained2::getInstance();

var_dump($c);
var_dump($c1);
var_dump($d);
var_dump($d1);


всё это выведет:

# php -f sing.php
Singleton::__construct
Chained::__construct
Chained2::__construct
object(Chained)#1 (0) {
}
object(Chained)#1 (0) {
}
object(Chained2)#2 (0) {
}
object(Chained2)#2 (0) {
}


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

Update #0: хм, а я вот только что подумал -- это ведь неправильно! о.О
Singleton ведь не должен мочь создать объект Chained'а, т.к. ничего о нём не знает?

Update #1: спасибо stas за подсказанную get_called_class()
Subscribe

  • последняя капля

    многие вещи в моей жизни проходят учёт по графе "похуй" в моей личной табели о рангах. это просто даёт возможность не обращать внимания на всякую…

  • про СУП

    забавно. вот я курю и стряхиваю пепел в пепельницу. даже не задумываюсь о ней, поглощённый совсем другими мыслями. и когда я в гости к кому-нибудь…

  • [йоптваю] менюшко в висте

    вынь-виста. кины всякие -- на линукс-сервере через самбу. в эксплорере давлю ПКМ на .avi -- тормоза, тормоза, Explorer (Not Responding), тормоза…

  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 22 comments

  • последняя капля

    многие вещи в моей жизни проходят учёт по графе "похуй" в моей личной табели о рангах. это просто даёт возможность не обращать внимания на всякую…

  • про СУП

    забавно. вот я курю и стряхиваю пепел в пепельницу. даже не задумываюсь о ней, поглощённый совсем другими мыслями. и когда я в гости к кому-нибудь…

  • [йоптваю] менюшко в висте

    вынь-виста. кины всякие -- на линукс-сервере через самбу. в эксплорере давлю ПКМ на .avi -- тормоза, тормоза, Explorer (Not Responding), тормоза…