解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效 的问题
大部分PHP框架中,为了防止一个类被重复实例化,往往采用“单例模式”实例化类。我们的项目框架是这样做的:
先写好一个基类 /framework/Base.class.php,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?php namespace framework; defined( 'SITE_PATH' ) or die ( 'Access Denied' ); /** * 业务基类 * * @package framework */ class Base { /** * 类实例化(单例模式) * * @return mixed * @throws \Exception */ public static function instance() { static $_instance = array (); $classFullName = get_called_class(); if (!isset( $_instance [ $classFullName ])) { core_load_class( $classFullName ); if (! class_exists ( $classFullName , false)) { throw new \Exception( '"' . $classFullName . '" was not found !' ); } $_instance [ $classFullName ] = new $classFullName (); } return $_instance [ $classFullName ]; } } ?> |
某个 会员模型类 继承 Base 基类, \common\model\MemberModel.class.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <?php namespace common\model; use framework\Base; defined( 'SITE_PATH' ) or die ( 'Access Denied' ); /** * 会员 模型 */ class MemberModel extends Base { protected $tableName = 'member' ; protected $pk = 'memberId' ; /** * 根据memberId获取记录 * * @param string $memberId 会员ID * @param string $field 要显示的字段 * @return array */ public function getByMemberId( $memberId = '' , $field = '*' ) { return array (); // 随便写下 } } ?> |
其他方法中,使用该 会员模型,参考代码如下:
1 | MemberModel::instance()->getByMemberId( '168' ); |
遇到的问题
本以为很完美,但是在 PhpStorm 中,根本识别不了 MemberModel::instance() 实例化类的方式,它会提示 getByMemberId() 方法不存在。这很让人崩溃,因为这样,
1、当敲完代码 MemberModel::instance()-> 后,PhpStorm 不会自动弹出它的 属性/方法 下拉提示框;
2、无法通过快捷键 重构 MemberModel 类的 getByMemberId() 方法;
如何解决上述 PhpStorm 代码自动提示功能失效的问题?
我怀疑是 PhpStorm 对基类中的代码:
$_instance[$classFullName] = new $classFullName();
return $_instance[$classFullName];
不识别导致的!
今天在逛别人的博客时,看到对“PHP延迟静态绑定”知识点的介绍,先前早就看到过这个概念,但一直没有仔细去研究,查了下资料,汇总如下:
文章提到,通过 static() 方法,能返回子类的实例。static 正好是 PHP 的关键字,相信 PhpStorm 对它一定是很敏感的。
果不出我所料,调整了下基类方法,问题解决:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | <?php namespace framework; defined( 'SITE_PATH' ) or die ( 'Access Denied' ); /** * 业务基类 * * @package framework */ class Base { /** * 类实例化(单例模式) */ public static function instance() { static $_instance = array (); $classFullName = get_called_class(); if (!isset( $_instance [ $classFullName ])) { core_load_class( $classFullName ); if (! class_exists ( $classFullName , false)) { throw new \Exception( '"' . $classFullName . '" was not found !' ); } // $_instance[$classFullName] = new $classFullName(); // 1、先前这样写的话,PhpStrom 代码提示功能失效; // 2、并且中间变量不能是 数组,如 不能用 return $_instance[$classFullName] 形式返回实例对象,否则 PhpStrom 代码提示功能失效; $instance = $_instance [ $classFullName ] = new static (); return $instance ; } return $_instance [ $classFullName ]; } /** *【老版本】类实例化(单例模式) *【缺陷】PhpStorm 的代码提示功能失效 * * @return mixed * @throws \Exception */ // public static function instance() // { // static $_instance = array(); // // $classFullName = get_called_class(); // if (!isset($_instance[$classFullName])) // { // core_load_class($classFullName); // if (!class_exists($classFullName, false)) // { // throw new \Exception('"' . $classFullName . '" was not found !'); // } // $_instance[$classFullName] = new $classFullName(); // } // // return $_instance[$classFullName]; // } } ?> |
效果图如下:
延伸阅读:
分类:
40.电脑/软件使用
, 03.开发问题
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)