php 单例调用

1.今天写了一个redis单例模式类,使用自定义方法调用时,奇怪的是调用两次只有一次生效,各位大佬帮忙瞅瞅呗..
代码如下:
调用代码:

hook('redis_plugin', 'joinQueue', ['key' => 'leo', 'value' => ['测试hook']], 1);
hook('redis_plugin', 'popQueue', ['key' => 'leo'], 1);

hook方法代码:

function hook($class, $function , $params = null, $hookType = 0)
{
    $obj = \eoc\library\Hook::getInstance();
    $obj->runHook($class, $function, $hookType, $params);
}

hook类代码:

<?php

namespace eoc\library;


class Hook
{
    private static $instance;

    /**
     * @var string hook文件存放目录
     */
    protected static $hook;
    //防止类被克隆
    private function __clone()
    {
        trigger_error('Clone is not allow!',E_USER_ERROR);
    }

    //防止类重复实例化
    public static function getInstance()
    {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }


    /**
     * @param $class
     * @param $function
     * @param null $params 运行插件
     * @param int 插件模式 0 工厂模式 1单例模式
     */
    public function runHook($class, $function, $hookType = 0, $params = null)
    {
        //设置hook类存放目录
        $hookPath = APP_PATH . DIRECTORY_SEPARATOR . get_config('plugin_dir') . DIRECTORY_SEPARATOR;
        //设置后缀
        $postfix = '.class.php';
        $result = include($hookPath . $class . DIRECTORY_SEPARATOR . $class . $postfix);

        if (!$result) {
            setErrorInfo($class . '插件不存在');
        }
        switch ($hookType) {
            case 0:
                $object = new $class();
                $object->$function($params);
                break;
            case 1:
                //$object = $class::getInstance();
                dump($params);
               // $object::$function($params);
                break;
            default:
                # code...
                break;
        }

    }
}
人到中年有点甜
浏览 351回答 3
3回答

PIPIONE

多谢各位大佬的指点,已经解决了把include 替换为require_once就好了

ABOUTYOU

你这也叫单例runHook hook 也是个静态方法 $obj = \eoc\library\Hook::getInstance(); $obj::runHook($class, $function, $hookType, $params); 你来告诉我,这各下面有什么区别 \eoc\library\Hook::runHook($class, $function, $hookType, $params);
打开App,查看更多内容
随时随地看视频慕课网APP