大部分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. H5一二事

    先回顾一下WEB技术的几个阶段 Web 1.0 内容为主,主要流行HTML和CSS Web 2.0 动态网页,流行AJAX/JavaScript/DOM H5 时代,WEB开发回归富客户端 那么H5肯 ...

  2. 【python】禁止print输出换行的方法

    print后用一个逗号结尾就可以禁止输出换行,例子如下 >>> i=0 >>> while i < 3: print i i+=1 0 1 2 禁止输出换行后 ...

  3. Array类型(二)

    1.concat()方法可以基于当前数组中的所有项创建一个新数组. 先创建当前数组的一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组. var colors = ["r ...

  4. 深入char、varchar、text和nchar、nvarchar、ntext的区别详解

    很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大 ...

  5. scrapy模拟登录

    对于scrapy来说,也是有两个方法模拟登陆: 直接携带cookie 找到发送post请求的url地址,带上信息,发送请求 scrapy模拟登陆之携带cookie 应用场景: cookie过期时间很长 ...

  6. Centos6.5下通过shell脚本快速安装samba服务器

    使用方法如下: 上传脚本到linux服务器授权

  7. ZooKeeper系列(6):ZooKeeper机制架构

    一.ZooKeeper权限管理机制 1.1 权限管理ACL(Access Control List) ZooKeeper 的权限管理亦即ACL 控制功能,使用ACL来对Znode进行访问控制.ACL的 ...

  8. Python 自定义异常处理Error函数

    #!/usr/bin/env python # -*- coding:utf-8 -*- CODEMSG = { 2000: u"True", 4000: u"客户上传的 ...

  9. CentOS7服务管理(重启,停止,自动启动命令)

    我们对service和chkconfig两个命令都不陌生,systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体. systemctl is-enable ...

  10. Mahout 0.10.1安装(Hadoop2.6.0)及Kmeans测试

    1.版本和安装路径 Ubuntu 14.04 Mahout_Home=/opt/mahout-0.10.1 Hadoop_Home=/usr/local/hadoop Mavent_Home=/opt ...