解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效的问题

大部分PHP框架中,为了防止一个类被重复实例化,往往采用“单例模式”实例化类。我们的项目框架是这样做的:

先写好一个基类 /framework/Base.class.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

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 代码自动提示功能失效的问题?

下面提供两种解决方法:

(1)从代码上解决代码提示失效的问题

我怀疑是 PhpStorm 对基类中的代码:

$_instance[$classFullName] = new $classFullName();

return $_instance[$classFullName];

不识别导致的!

其实这里涉及到关于“PHP延迟静态绑定”相关的知识,关于PHP延迟静态绑定的介绍,可以参考这里:

父类方法返回子类实例:PHP延迟静态绑定

文章提到,通过 static() 方法,能返回子类的实例。static 正好是 PHP 的关键字,相信 PhpStorm 对它一定是很敏感的。

果不出我所料,调整了下基类方法,问题解决:

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];

// }

}

(2)从注释上解决代码提示失效的问题

直接添加一个@return static的注解即可(phpstorm还支持@return $this   @return self这两种注解)

示例代码如下:

namespace framework;

defined('SITE_PATH') or die('Access Denied');

/**

* 业务基类

*

* @package framework

*/

class Base

{

/**

* 类实例化(单例模式)

*

* @return static //以上代码仅需改动这里即可

* @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/16358.htmlwww.phpzy.comtrue/php/16358.htmlTechArticle解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效的问题 大部分PHP框架中,为了防止一个类被重复实例化,往往采用“单例模式”实例化类。我们的项目框架是这样做的...

继承单例模式 php_解决 PhpStorm 对 用单例模式实例化PHP类时,代码自相关推荐

  1. 解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效 的问题

    大部分PHP框架中,为了防止一个类被重复实例化,往往采用"单例模式"实例化类.我们的项目框架是这样做的: 先写好一个基类 /framework/Base.class.php,内容如 ...

  2. 单例模式应用场景_三、单例模式详解

    4.单例模式详解 4.1.课程目标 1.掌握单例模式的应用场景. 2.掌握IDEA环境下的多线程调试方式. 3.掌握保证线程安全的单例模式策略. 4.掌握反射暴力攻击单例解决方案及原理分析. 5.序列 ...

  3. java单例模式_Java描述设计模式(01):单例模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.单例模式 1.概念图解 单例设计模式定义:确保这个类只有一个实例,并且自动的实例化向系统提供这个对象. 2.样例代码 package Si ...

  4. 解决PhpStorm卡顿的问题

    解决PhpStorm卡顿的问题 参考文章: (1)解决PhpStorm卡顿的问题 (2)https://www.cnblogs.com/lishanlei/p/7754149.html (3)http ...

  5. C++57个入门知识点_50 菱形继承与虚继承(C++中语法允许多重继承造成菱形继承;会造成近亲结婚的问题;可以通过虚继承的方式解决;实际项目中不多用多重继承)

    上篇C++57个入门知识点_49 多重继承与组合(一个类同时具有多个类的属性的方法:多重继承或者组合:多重继承:一个类同时继承多个类:多重继承构造和析构的顺序与普通继承类似:组合:类中包含多个成员对象 ...

  6. 继承菱形继承问题及解决

    继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类.继承呈现了面向对象程序设 ...

  7. 利用python画钻石_python多继承(钻石继承)问题和解决方法简单示例

    本文实例讲述了python多继承(钻石继承)问题和解决方法.分享给大家供大家参考,具体如下: 在菱形多继承中,如果用父类.__init__()来调用父类的初始化方法,最上层会执行两次,所以遇到这种情况 ...

  8. 解决企业数字化“历史遗留问题”,低代码具备天然优势 | 专访腾讯云微搭骆勤

    据Gartner机构预测,到2025年,企业70%的新应用将会通过低代码或者无代码技术进行开发.还有数据显示,2020年中国的低市场规模已经达到19亿元,而到2024年,低代码市场将达到百亿量级. 左 ...

  9. 后盾网lavarel视频项目---phpstorm 配置ftp, 自动更新同步代码

    后盾网lavarel视频项目---phpstorm 配置ftp, 自动更新同步代码 一.总结 一句话总结: 1.在phpstorm中设置:路径Tools/Deployment/Configuratio ...

最新文章

  1. Redis的这些拓展方案,用过一条的就是大牛!
  2. 如何从PostgreSQL json中提取数组
  3. arm下如何烧写指定分区大小的内核和文件系统
  4. Apache(1)——安装
  5. 电商前台模板中文html5_跨境电商平台上产品如何上传?虾皮新版批量上传工具使用指南分享...
  6. VLC详细的使用说明以及配置说明综合示范实例精通VLC开发
  7. Activity 的启动模式
  8. 每天一道剑指offer-对称的二叉树
  9. 计算机教室网络连接示意图,多媒体电教室解决方案
  10. 几张清晰的图讲清楚什么是Java堆碎片?(内存碎片化)
  11. 知其然(1) 无法使用 DISTINCT, GROUP BY 等子句从视图中选择 ROWID 或采样
  12. 如何免费且快速的搭建个人网站
  13. 如何扩充C盘容量(在不重装系统或删除其他盘内容的条件下)
  14. python爬duitang的摄影类图片
  15. easypanel默认php版本设置,easypanel面板+kangle
  16. 【板栗糖GIS】联想win11如何解决浏览器edge默认页面无法修改的问题
  17. 干货|以产品要素设计解读线上小微信贷
  18. SQLiteSpy执行Sql语句提示No such collation sequence : PhoneBook
  19. 如何删除hao123?
  20. 国内外主流静态分析类工具汇总

热门文章

  1. linux下实现桥接联网
  2. 商业大亨微信草花服务器,商业大亨2每日答题和服务器进度奖励
  3. maya python api,如何使用Maya Python API查找所有上游DG节点?
  4. leetcode题解48-旋转图像
  5. 常见条码及其相关概念简介
  6. 人工神经网络算法原理和应用
  7. MongoDB3.xxx 用户创建
  8. 2017年10月2日日志
  9. es6笔记6^_^generator
  10. LeetCode - Remove Nth Node From End of List