继承static的注意点

singleton模式会使用

<?php
class Auth
{
protected static $_instance = null; /**
* 单用例入口
*
* @return Auth
*/
public static function getInstance()
{
if (! self::$_instance) {
self::$_instance = new self ();
}
return self::$_instance;
}
} class AuthV2 extends Auth
{ // 使用父类的
// protected static $_instance = null; /**
* 单用例入口
*
* @return AuthV2
*/
public static function getInstance()
{
if (! self::$_instance) {
self::$_instance = new self ();
}
return self::$_instance;
} public function checkLogin(){
return false;
}
} Auth::getInstance();
AuthV2::getInstance()->checkLogin();

结果

上面的结果看上去感觉没有问题,但是...

// 出现如下错误
Fatal error: Call to undefined method Auth::checkLogin()

分析

  • 提示说使用的类竟然是Auth,而不是AuthV2,为什么?先看流程
  1. Auth::getInstance(); 给 Auth的$_instance赋值了。
  2. AuthV2::getInstance();返回的对象是直接使用父级Auth的$_instance,因此,没有再次执行new self()进行实例化。
  • 如果让Auth::getInstance() 再次实例化?
  1. AuthV2需要使用自己的 protected static $_instance = null;

正确代码:

<?php
class Auth
{
protected static $_instance = null; /**
* 单用例入口
*
* @return Auth
*/
public static function getInstance()
{
if (! self::$_instance) {
self::$_instance = new self ();
}
return self::$_instance;
}
} class AuthV2 extends Auth
{ // 必须使用自身的
protected static $_instance = null; /**
* 单用例入口
*
* @return AuthV2
*/
public static function getInstance()
{
if (! self::$_instance) {
self::$_instance = new self ();
}
return self::$_instance;
} public function checkLogin(){
return false;
}
} Auth::getInstance();
AuthV2::getInstance()->checkLogin();

最新文章

  1. 如何用命令检查Linux服务器性能
  2. for循环每次展示固定条数的数据的写法。
  3. XE6 &amp; IOS开发之开发者账号、苹果证书(3):关于在XE6中使用苹果证书的简单介绍
  4. C#集合--ICollection接口和IList接口
  5. TSQL点滴
  6. weblogic管理1——创建 和 删除一个domain
  7. JAVA实例,求用户输入的整数是否是偶数
  8. [小结][N种方法]实现WPF不规则窗体
  9. String与string的区别(注意大小写)
  10. 在同一个系统上装两个不同版本的jdk,配置环境变量不起作用,jdk版本的切换问题
  11. MongoDB远程维护客户端工具的使用!
  12. 小程序:scroll-view组件滑动多次触发scroll事件的bug解决
  13. boke练习: spring boot: security post数据时,要么关闭crst,要么添加隐藏域
  14. $.post() 和 $.get() 如何同步请求
  15. ROS安装
  16. 分形之拆分三角形(Split Triangle)
  17. iOS - 实现语言本地化/国际化
  18. UVAlive6439_Pasti Pas!
  19. OGG_GoldenGate数据迁移三进程Extract / Dump / Relicat(案例)
  20. leetcode 7 reverse integer 反转整数

热门文章

  1. 深度学习&mdash;&mdash;练习
  2. Swift可选类型(Optional)之星耀
  3. REST API 安全设计
  4. Android应用程序安装过程浅析
  5. UG如何把语言改成中文,UG如何把界面语言改成中文
  6. 我在CSDN开通博客啦!
  7. Linux在终端启动程序关闭终端不退出的方法
  8. BZOJ_1576_[Usaco2009 Jan]安全路经Travel&amp;&amp;BZOJ_3694_最短路_树链剖分+线段树
  9. http报文和协议首部
  10. bzoj 1592: [Usaco2008 Feb]Making the Grade 路面修整【dp】