鍍金池/ 問答/PHP/ php 單例調(diào)用

php 單例調(diào)用

1.今天寫了一個(gè)redis單例模式類,使用自定義方法調(diào)用時(shí),奇怪的是調(diào)用兩次只有一次生效,各位大佬幫忙瞅瞅唄..
代碼如下:
調(diào)用代碼:

hook('redis_plugin', 'joinQueue', ['key' => 'leo', 'value' => ['測(cè)試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);
    }

    //防止類重復(fù)實(shí)例化
    public static function getInstance()
    {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }


    /**
     * @param $class
     * @param $function
     * @param null $params 運(yùn)行插件
     * @param int 插件模式 0 工廠模式 1單例模式
     */
    public function runHook($class, $function, $hookType = 0, $params = null)
    {
        //設(shè)置hook類存放目錄
        $hookPath = APP_PATH . DIRECTORY_SEPARATOR . get_config('plugin_dir') . DIRECTORY_SEPARATOR;
        //設(shè)置后綴
        $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;
        }

    }
}
回答
編輯回答
澐染

你這也叫單例
runHook hook 也是個(gè)靜態(tài)方法

$obj = \eoc\library\Hook::getInstance();
$obj::runHook($class, $function, $hookType, $params);

你來告訴我,這各下面有什么區(qū)別

\eoc\library\Hook::runHook($class, $function, $hookType, $params);
2017年9月15日 17:11
編輯回答
莫小染

多謝各位大佬的指點(diǎn),已經(jīng)解決了把include 替換為require_once就好了

2017年5月23日 08:49
編輯回答
抱緊我

問題1

寫了一個(gè)redis單例模式

那干嘛使用$obj = \eoc\library\Hook::getInstance();?
到底是Hook類單例還是redis單例
問題2
靜態(tài)方法沒有單例模式
問題3
你的hook類是干嘛用的?直接把runhook的方法寫在hook方法里不就行了

2017年7月14日 02:59