为了账号安全,请及时绑定邮箱和手机立即绑定

php 单例调用

php 单例调用

PHP
人到中年有点甜 2019-03-17 00:10:11
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; } } }
查看完整描述

3 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

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

查看完整回答
反对 回复 2019-03-18
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

你这也叫单例
runHook hook 也是个静态方法

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

你来告诉我,这各下面有什么区别

\eoc\library\Hook::runHook($class, $function, $hookType, $params);
查看完整回答
反对 回复 2019-03-18
  • 3 回答
  • 0 关注
  • 350 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信