大部分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类时,代码自动提示功能失效 的问题相关推荐

  1. 继承单例模式 php_解决 PhpStorm 对 用单例模式实例化PHP类时,代码自

    解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效的问题 大部分PHP框架中,为了防止一个类被重复实例化,往往采用"单例模式"实例化类.我们的项目框架是这 ...

  2. MyEclipse 代码自动提示功能失效 提示No Default Proposals 或 no completions available 的解决方法 转...

    通常进行以下操作就行了:      1.菜单window->Preferences->Java->Editor->Content Assist->Enable auto ...

  3. eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?

    eclipse代码自动提示设置.如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)? 参考文章: (1)eclipse代码自动提示设置.如何配置eclipse的代码自动提示功能( ...

  4. 关于 intell IDEA 的代码自动提示功能没有,删了导包也不报红 (已解决)

    1.错误提示:Power save mode is on   Code insight and background tasks are disabled. 2.解决方法:file->Power ...

  5. java - 解决idea代码自动提示功能消失的问题

    问题:idea代码自动提示消失 方案一: File --> Setting -->  Editor --> General --> Code Completion 方案二: 若 ...

  6. raver php,为PhpStorm添加Laravel 代码智能提示功能

    1.安装laravel插件 image 2. 应用 composer 安装 barryvdh/laravel-ide-helper 2.1 右键打开composer 搜索laravel-ide-hel ...

  7. 解决opencv在pycharm中无代码自动提示的bug

    2018-03-0422:19:39 首先,估计这不是bug 可能是我自己误操作导致的,但是让我搞了好久才搞定,实在是苦恼 如图已实现功能,百度里有很多朋友出现了,这个无代码提示的问题 大概是这样的, ...

  8. Chrome谷歌浏览器最小化和页面遮挡后JS代码不稳定和功能失效的解决思路

    1. 前言: 一位客户向我定制了一款网页版区块链游戏自动挂机脚本,主要需求是定时派遣队伍外出打工,定时派回等功能. 脚本我主要用JavaScript代码来实现,用定时器 setInterval().s ...

  9. eclipse自动提示功能没有的解决办法

    学JAVA这么久才知道原来我的eclipse的自动提示功能一直是没开启的,一直以来都是纯手打???难过觉得JAVA是一进门就入土,在网上找到一个可以打开这个功能的方法 1.我window->Pr ...

最新文章

  1. JSON数据的HTTP Header应该怎么标记?
  2. vue - package.json
  3. 手写AngularJS脏检查机制
  4. HDU2222 Keywords Search(AC自动机模板)
  5. docker部署resin应用
  6. 本田思域自动挡的使用技巧
  7. oracle对某两列求和再求和_只会SUM函数求和,试试这5种求和函数,十倍提高工作效率...
  8. Docker 视频教程 ( 猿课 )
  9. 站群的建立,是一个长期的工作,一年时间吧
  10. 微信小程序Canvas画图片,合成图片,微信头像合成,变更国庆头像,头像增加背景
  11. python爬虫豆瓣top250_Python 爬取豆瓣TOP250实战
  12. 仿酒仙网品牌活动动画效果 (鼠标移上 图片平移)
  13. 苹果公司:Apple大中华区的注册开发者数量现已超过500万
  14. LM5161QPWPTQ1
  15. WorldFirst怎么样?跨境收款工具万里汇WorldFirst解析!
  16. 小麦盒子cdn_国内外优秀的 CDN 加速服务商,让你的网站访问速度飞起来
  17. 中国抓到了勒索病毒作者!!
  18. python求一个序列的和_Python合集之Python序列(三)
  19. Java阶段性测试--第四五六大题参考代码
  20. linux系统中的sl命令 以及其他好玩的东西

热门文章

  1. 自然语言处理真实项目实战(20170822)
  2. JavaWeb之多语言国际化
  3. 图像视频处理中Win7 32位+VS2010+OpenCV2.3.1的配置过程
  4. silverlight体验之三:简单控件堆成个Login
  5. PyTorch 入坑四 梯度、链式法则、计算图与反向传播
  6. 反向传播(Back Propagation)与神经网络(Neural Network)
  7. python可用编程模块规模多大_哪些Python模块可用于编程竞赛?
  8. opengl光线追踪的程序_【PathTracing】实时光线追踪和BSSRDF的那些事
  9. java有几大对象_一个 Java 对象到底有多大?
  10. linux tcp前景,linux – 为什么在Xen下TCP接受()性能如此糟糕?