<?php
/**
 * Link         :   http://www.phpcorner.net
 * User         :   qingbing<780042175@qq.com>
 * Date         :   2018-10-27
 * Version      :   1.0
 */

namespace Abstracts;

/**
 * 单例模式基类函数
 * Class SingleTon
 * @package Helper
 */
abstract class SingleTon extends Base
{
    /**
     * 变量保存
     * @var array
     */
    private static $_instances = [];

    /**
     * 获取实例
     * @return $this
     */
    final public static function getInstance()
    {
        $className = get_called_class();
        if (!isset(self::$_instances[$className])) {
            $instance = new $className();
            /* @var SingleTon $instance */
            $instance->init();
            self::$_instances[$className] = $instance;
        }
        return self::$_instances[$className];
    }

    /**
     * 私有构造器
     * SingleTon constructor.
     */
    final private function __construct()
    {
    }

    /**
     * 单例模式初始化函数，在构造函数后执行，子类可以覆盖
     */
    protected function init()
    {
    }
}