BaseService.php 1.8 KB
<?php
/**
 * @author:wlj
 * @date: 2022/6/30 15:44
 */

namespace App\Services;

use App\Enums\Common\Code;
use App\Exceptions\BsideGlobalException;
use Mockery;

class BaseService
{
    /**
     * 单例模式
     * 特点:三私,两静,一公
     * 三私:三个私有方法,(静态变量、构造函数、克隆函数)
     * 两静:两个静态方法,(一个静态变量,一个静态方法)
     * 一公:单例模式的出口
     *
     * 优点:
     *   1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。
     *   2、避免对资源的多重占用(比如写文件操作)。
     */

    protected static $instance;

    /**
     * @return static
     */
    public static function getInstance()
    {
        if ((static::$instance[static::class] ?? null) instanceof static) {
            return static::$instance[static::class];
        }
        return static::$instance[static::class] = new static();
    }

    /**
     * @return Mockery\Mock
     */
    public static function mockInstance()
    {
        return static::$instance[static::class] = Mockery::mock(static::class)
                                                         ->makePartial()
                                                         ->shouldAllowMockingProtectedMethods();
    }

    private function __construct()
    {

    }

    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    /**
     * @notes: 手动抛出异常
     * @param string $msg
     * @param string $code
     * @throws BsideGlobalException
     * @author:wlj
     * @date: 2022/7/19 14:25
     */
    public function fail(string $msg, string $code = Code::SYSTEM_ERROR)
    {
        throw  new BsideGlobalException($code, $msg);
    }
}