php 单利模式实例化,解决 PhpStorm 对 用单例模式实例化PHP类时,代码自

d720a41e663ec0b5031047b59b583548.png

__new__()在__init__()之前被调用,用于生成实例对象.利用这个方法和类属性的特性可以实现设计模式中的单例模式.单例模式是指创建唯一对象吗

先写好一个基类 /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(); // 随便写下

}

}

?>

8b6073550dc72ecb4b48a7ce15f47e88.png

其他方法中,使用该 会员模型,参考代码如下:

MemberModel::instance()->getByMemberId('168');

遇到的问题

本以为很完美,但是在 PhpStorm 中,根本识别不了 MemberModel::instance() 实例化类的方式,它会提示 getByMemberId() 方法不存在。这很让人崩溃,因为这样,

1、当敲完代码 MemberModel::instance()-> 后,PhpStorm 不会自动弹出它的 属性/方法 下拉提示框;

e2f8cb9686cb51d721a4d247a7e5e1a8.png

2、无法通过快捷键 重构 MemberModel 类的 getByMemberId() 方法;

如何解决上述 PhpStorm 代码自动提示功能失效的问题?

下面提供两种解决方法:

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

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

4661f1193d54b43ad1085655f036c3b9.png

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

return $_instance[$classFullName];

不识别导致的!

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

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

20161109093939129.png

文章提到,通过 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];

}

}

__new__()在__init__()之前被调用,用于生成实例对象.利用这个方法和类属性的特性可以实现设计模式中的单例模式.单例模式是指创建唯一对象吗,单例模式设计的类只能实例化一个对象.。一、singleton单例模式singleton单例模式是最简单的设计模式,它的主要作用是保证在程序运行生命周期中,使用了单类模式的类只能有一个实例对象存在。一旦创建sqlsessionfactory类的实例,该实例应该在应用程序执行期间都存在,根本不需要每一次操作时都创建,所以其最佳实践方式就是单例模式,或者使用spring框架来实现单例模式对sqlsessionfactory对象进行有效管理(后续会讲解)。

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/jisuanjixue/article-106508-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值