大部分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. eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?

    对于编程人员来说,要记住大量的类名或类方法的名字,着实不是一件容易的事情.如果要IDE能够自动补全代码,那将为我们编程人员带来很大帮助. eclipse代码里面的代码提示功能默认是关闭的,只有输入“. ...

  2. eclipse自动提示功能没了的解决办法(转载)

    eclipse自动提示功能没了的解决办法 标签: eclipse联想 2012-08-09 14:32 24687人阅读 评论(7) 收藏 举报  分类: Android(38)  版权声明:本文为博 ...

  3. 在IDEA中代码自动提示第一个字母大小写必须匹配的解决

    在IDEA中代码自动提示第一个字母大小写必须匹配的解决 学习了:http://blog.csdn.net/babys/article/details/41775715 setting>Edito ...

  4. xcode代码提示功能失效的解决方法

    xcode 自动提示很好用 然而大量的工作也是让他吃不消了 结果今天提示功能给我来了个罢工 这当然是不行的 也是万能的搜索帮我解决了这个问题 方法很多 选择了简单的 xcode --> Wind ...

  5. 为PhpStorm添加Laravel 代码智能提示功能

    php artisan clear-compiled //清除bootstrap/compiled.php php artisan ide-helper:generate //为 Facades 生成 ...

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

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

  7. PHPstorm支持YAF框架代码自动提示

    文件下载地址:https://github.com/xudianyang/yaf.auto.complete 然后找到phpstorm     File->settings->Langua ...

  8. PHPStorm配置支持友好的Laravel代码自动提示

    在项目的composer.json "barryvdh/laravel-ide-helper":"dev-master" 项目config/app.php Ba ...

  9. 让 idea webstorm phpstorm 能够 识别 thinkphp 的方法(自动提示功能)

    1.在/ThinkPHP/Library/Think 目录下 新建一个文件,名为:  BaseController.class.php 2.BaseController.class.php 内容为 n ...

随机推荐

  1. Merge k Sorted Lists

    1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...

  2. 一些工具&名词

    长期维护更新: 极光推送.个推---移动端消息推送 花生壳---外网访问内网 跳板机-堡垒机 jumpserver开源跳板机 DJANGO --- python web开发架构 Apache Shir ...

  3. CHM打不开的解决方法

    CHM打不开的解决方法 听语音 | 浏览:62240 | 更新:2013-02-04 14:58 | 标签:软件 1 2 3 4 5 6 分步阅读 一键约师傅 百度师傅高质屏和好师傅,拯救你的碎屏机 ...

  4. HBASE 安装法

    http://www.cnblogs.com/nexiyi/p/hbase_intro_94.html

  5. Intellij Idea中的Jetty报出Web application not found src/main/webapp错误的解决方案

    今天在Intellij Idea中编译项目的时候,运行起来一直会报出如下的错误: Web application not found src/main/webapp 当时感觉应该是什么文件缺少了.所以 ...

  6. 微信扫描打开APP下载链接提示代码优化

    上一次我发了一篇文章叫“微信打开网址添加在浏览器中打开提示”,里面我发出来了三个代码,分别是纯JS.js+html.jQuery+HTML代码.今天来一个简化版带可以关闭的按钮操作.使用的是纯JS+H ...

  7. 为什么 Java 8 中不再需要 StringBuilder 拼接字符串

    为什么 Java 8 中不再需要 StringBuilder 拼接字符串 来源:codeceo 发布时间:2016-12-27 阅读次数:427 0   在Java开发者中,字符串的拼接占用资源高往往 ...

  8. Linux 中 Nginx 重启关闭

    如果服务器正在运行的 Nginx 要进行升级.添加或删除模块时. 我们需要停掉服务器并做相应修改,这样服务器就要在一段时间内停止服务. Nginx可以在不停机的情况下进行各种升级动作而不影响服务器运行 ...

  9. Css--深入学习之切角

    本文是作者从别的网站和文章学习了解的知识,简单做了个笔记,想要学习更多的可以参考这里:[css进阶]伪元素的妙用--单标签之美,奇思妙想 带切角的矩形: 该图来源于(奇思妙想) Css代码: .not ...

  10. ubuntu14.04 python3.*连接mysql

    先下载pymysql文件,http://webscripts.softpedia.com/script/Database-Tools/PyMySQL-71606.html 我下载的是:PyMySQL- ...