PHP継承可能単例モード

830 ワード

<?php

class Single {

    protected static $instance = array();

    protected final function __construct() {
        $this->init();
    }

    protected final function __clone() {}

    protected function init() {}

    public final function getInstance() {
        $className = get_called_class();

        if (!isset($instance[$className])) {
            static::$instance[$className] = new static();
        }
        return static::$instance[$className];
    }

}
<?php

trait Single {

    private static $instance;

    private function __construct() {}

    private function __clone() {}

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

}