解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效 的问题
大部分PHP框架中,为了防止一个类被重复实例化,往往采用“单例模式”实例化类。我们的项目框架是这样做的:
先写好一个基类 /framework/Base.class.php,内容如下:
<?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
<?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(); // 随便写下}
}
?>
其他方法中,使用该 会员模型,参考代码如下:
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延迟静态绑定”知识点的介绍,先前早就看到过这个概念,但一直没有仔细去研究,查了下资料,汇总如下:
父类方法返回子类实例:PHP延迟静态绑定
文章提到,通过 static() 方法,能返回子类的实例。static 正好是 PHP 的关键字,相信 PhpStorm 对它一定是很敏感的。
果不出我所料,调整了下基类方法,问题解决:
<?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];
// }
}
?>
效果图如下:
延伸阅读:
父类方法返回子类实例:PHP延迟静态绑定
PHP的继承方法如何获取子类名?get_class() 和 get_called_class()
解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效 的问题相关推荐
- 继承单例模式 php_解决 PhpStorm 对 用单例模式实例化PHP类时,代码自
解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效的问题 大部分PHP框架中,为了防止一个类被重复实例化,往往采用"单例模式"实例化类.我们的项目框架是这 ...
- MyEclipse 代码自动提示功能失效 提示No Default Proposals 或 no completions available 的解决方法 转...
通常进行以下操作就行了: 1.菜单window->Preferences->Java->Editor->Content Assist->Enable auto ...
- eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?
eclipse代码自动提示设置.如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)? 参考文章: (1)eclipse代码自动提示设置.如何配置eclipse的代码自动提示功能( ...
- 关于 intell IDEA 的代码自动提示功能没有,删了导包也不报红 (已解决)
1.错误提示:Power save mode is on Code insight and background tasks are disabled. 2.解决方法:file->Power ...
- java - 解决idea代码自动提示功能消失的问题
问题:idea代码自动提示消失 方案一: File --> Setting --> Editor --> General --> Code Completion 方案二: 若 ...
- raver php,为PhpStorm添加Laravel 代码智能提示功能
1.安装laravel插件 image 2. 应用 composer 安装 barryvdh/laravel-ide-helper 2.1 右键打开composer 搜索laravel-ide-hel ...
- 解决opencv在pycharm中无代码自动提示的bug
2018-03-0422:19:39 首先,估计这不是bug 可能是我自己误操作导致的,但是让我搞了好久才搞定,实在是苦恼 如图已实现功能,百度里有很多朋友出现了,这个无代码提示的问题 大概是这样的, ...
- Chrome谷歌浏览器最小化和页面遮挡后JS代码不稳定和功能失效的解决思路
1. 前言: 一位客户向我定制了一款网页版区块链游戏自动挂机脚本,主要需求是定时派遣队伍外出打工,定时派回等功能. 脚本我主要用JavaScript代码来实现,用定时器 setInterval().s ...
- eclipse自动提示功能没有的解决办法
学JAVA这么久才知道原来我的eclipse的自动提示功能一直是没开启的,一直以来都是纯手打???难过觉得JAVA是一进门就入土,在网上找到一个可以打开这个功能的方法 1.我window->Pr ...
最新文章
- JSON数据的HTTP Header应该怎么标记?
- vue - package.json
- 手写AngularJS脏检查机制
- HDU2222 Keywords Search(AC自动机模板)
- docker部署resin应用
- 本田思域自动挡的使用技巧
- oracle对某两列求和再求和_只会SUM函数求和,试试这5种求和函数,十倍提高工作效率...
- Docker 视频教程 ( 猿课 )
- 站群的建立,是一个长期的工作,一年时间吧
- 微信小程序Canvas画图片,合成图片,微信头像合成,变更国庆头像,头像增加背景
- python爬虫豆瓣top250_Python 爬取豆瓣TOP250实战
- 仿酒仙网品牌活动动画效果 (鼠标移上 图片平移)
- 苹果公司:Apple大中华区的注册开发者数量现已超过500万
- LM5161QPWPTQ1
- WorldFirst怎么样?跨境收款工具万里汇WorldFirst解析!
- 小麦盒子cdn_国内外优秀的 CDN 加速服务商,让你的网站访问速度飞起来
- 中国抓到了勒索病毒作者!!
- python求一个序列的和_Python合集之Python序列(三)
- Java阶段性测试--第四五六大题参考代码
- linux系统中的sl命令 以及其他好玩的东西
热门文章
- 自然语言处理真实项目实战(20170822)
- JavaWeb之多语言国际化
- 图像视频处理中Win7 32位+VS2010+OpenCV2.3.1的配置过程
- silverlight体验之三:简单控件堆成个Login
- PyTorch 入坑四 梯度、链式法则、计算图与反向传播
- 反向传播(Back Propagation)与神经网络(Neural Network)
- python可用编程模块规模多大_哪些Python模块可用于编程竞赛?
- opengl光线追踪的程序_【PathTracing】实时光线追踪和BSSRDF的那些事
- java有几大对象_一个 Java 对象到底有多大?
- linux tcp前景,linux – 为什么在Xen下TCP接受()性能如此糟糕?