继承单例模式 php_解决 PhpStorm 对 用单例模式实例化PHP类时,代码自
解决 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类时,代码自相关推荐
- 解决 PhpStorm 对 用单例模式实例化PHP类时,代码自动提示功能失效 的问题
大部分PHP框架中,为了防止一个类被重复实例化,往往采用"单例模式"实例化类.我们的项目框架是这样做的: 先写好一个基类 /framework/Base.class.php,内容如 ...
- 单例模式应用场景_三、单例模式详解
4.单例模式详解 4.1.课程目标 1.掌握单例模式的应用场景. 2.掌握IDEA环境下的多线程调试方式. 3.掌握保证线程安全的单例模式策略. 4.掌握反射暴力攻击单例解决方案及原理分析. 5.序列 ...
- java单例模式_Java描述设计模式(01):单例模式
本文源码:GitHub·点这里 || GitEE·点这里 一.单例模式 1.概念图解 单例设计模式定义:确保这个类只有一个实例,并且自动的实例化向系统提供这个对象. 2.样例代码 package Si ...
- 解决PhpStorm卡顿的问题
解决PhpStorm卡顿的问题 参考文章: (1)解决PhpStorm卡顿的问题 (2)https://www.cnblogs.com/lishanlei/p/7754149.html (3)http ...
- C++57个入门知识点_50 菱形继承与虚继承(C++中语法允许多重继承造成菱形继承;会造成近亲结婚的问题;可以通过虚继承的方式解决;实际项目中不多用多重继承)
上篇C++57个入门知识点_49 多重继承与组合(一个类同时具有多个类的属性的方法:多重继承或者组合:多重继承:一个类同时继承多个类:多重继承构造和析构的顺序与普通继承类似:组合:类中包含多个成员对象 ...
- 继承菱形继承问题及解决
继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类.继承呈现了面向对象程序设 ...
- 利用python画钻石_python多继承(钻石继承)问题和解决方法简单示例
本文实例讲述了python多继承(钻石继承)问题和解决方法.分享给大家供大家参考,具体如下: 在菱形多继承中,如果用父类.__init__()来调用父类的初始化方法,最上层会执行两次,所以遇到这种情况 ...
- 解决企业数字化“历史遗留问题”,低代码具备天然优势 | 专访腾讯云微搭骆勤
据Gartner机构预测,到2025年,企业70%的新应用将会通过低代码或者无代码技术进行开发.还有数据显示,2020年中国的低市场规模已经达到19亿元,而到2024年,低代码市场将达到百亿量级. 左 ...
- 后盾网lavarel视频项目---phpstorm 配置ftp, 自动更新同步代码
后盾网lavarel视频项目---phpstorm 配置ftp, 自动更新同步代码 一.总结 一句话总结: 1.在phpstorm中设置:路径Tools/Deployment/Configuratio ...
最新文章
- Redis的这些拓展方案,用过一条的就是大牛!
- 如何从PostgreSQL json中提取数组
- arm下如何烧写指定分区大小的内核和文件系统
- Apache(1)——安装
- 电商前台模板中文html5_跨境电商平台上产品如何上传?虾皮新版批量上传工具使用指南分享...
- VLC详细的使用说明以及配置说明综合示范实例精通VLC开发
- Activity 的启动模式
- 每天一道剑指offer-对称的二叉树
- 计算机教室网络连接示意图,多媒体电教室解决方案
- 几张清晰的图讲清楚什么是Java堆碎片?(内存碎片化)
- 知其然(1) 无法使用 DISTINCT, GROUP BY 等子句从视图中选择 ROWID 或采样
- 如何免费且快速的搭建个人网站
- 如何扩充C盘容量(在不重装系统或删除其他盘内容的条件下)
- python爬duitang的摄影类图片
- easypanel默认php版本设置,easypanel面板+kangle
- 【板栗糖GIS】联想win11如何解决浏览器edge默认页面无法修改的问题
- 干货|以产品要素设计解读线上小微信贷
- SQLiteSpy执行Sql语句提示No such collation sequence : PhoneBook
- 如何删除hao123?
- 国内外主流静态分析类工具汇总