如何在PHP中子类化Singleton?

时间:2011-11-02 21:06:14

标签: php design-patterns singleton

我正在尝试子类化使用单例模式的类,并使用子类填充实例。

我似乎遇到了一些麻烦。

class Singleton {

    static private $instance;

    static public function instance(){
        if(is_null(self::$instance)){
            self::$instance = new self();
        }
        return self::$instance;
    }

    private function __construct(){}

}

class MySingleton extends Singleton {

}

echo get_class(MySingleton::instance()); //=> Singleton

//=> I'm hoping to see MySingleton

3 个答案:

答案 0 :(得分:8)

您正在寻找的是late static binding这是PHP 5.3的新功能。尝试将new self()替换为new static(),这应该适合您。

self始终引用包含的类,而static引用“被调用的”类。

答案 1 :(得分:1)

您的单例基类可以防止它原样。如果您将代码更改为此,它将起作用。

<?php


class Singleton {

    static private $instances = array();

    static public function instance(){
        $class = get_called_class();
        if(!isset(self::$instances[$class])){
            self::$instances[$class] = new $class();
        }
        return self::$instances[$class];
    }

    private function __construct(){}

}

class MySingleton extends Singleton {

}

echo get_class(MySingleton::instance()); //=> MySingleton

现在它可以工作,因为Singleton允许每个子类一个实例。

答案 2 :(得分:1)

这是有效的

<?php

class Singleton {

    static private $instance;
    static public function instance(){
        static $instance = null;  
        return $instance ?: $instance = new static;
    }

    public function __construct(){}

}

class MySingleton extends Singleton {
}

但我推荐以下一个:

<?php
class Singleton {

    static protected $instance;              //should not be private

    static public function instance(){
        if(is_null(static::$instance)){         
            static::$instance = new static();
        }
        return static::$instance;

    }

    public function __construct(){}

}

class MySingleton extends Singleton {
    static protected $instance;    //must explicitly declared
}