继承static的注意点
继承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,为什么?先看流程
- Auth::getInstance(); 给 Auth的$_instance赋值了。
- AuthV2::getInstance();返回的对象是直接使用父级Auth的$_instance,因此,没有再次执行new self()进行实例化。
- 如果让Auth::getInstance() 再次实例化?
- 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();
继承static的注意点的更多相关文章
- interface中定义default方法和static方法
interface的default方法和static方法 接口中可以定义static方法,可通过接口名称.方法名()调用,实现类不能继承static方法: 接口中可以定义default方法,defau ...
- Nginx学习笔记(六) 源码分析&启动过程
Nginx的启动过程 主要介绍Nginx的启动过程,可以在/core/nginx.c中找到Nginx的主函数main(),那么就从这里开始分析Nginx的启动过程. 涉及到的基本函数 源码: /* * ...
- CSS权威指南 - 基本视觉格式化 1
定位 定位的想法很简单元素框相对于正常位置出现在哪里. 定位:static,相对, 绝对, fixed, 继承 static就是默认的位置 相对就是相对于默认位置的偏移.原来的static定位位置依然 ...
- CSS权威指南 - 浮动和定位 1
定位 定位的想法很简单元素框相对于正常位置出现在哪里. 定位:static,相对, 绝对, fixed, 继承 static就是默认的位置 相对就是相对于默认位置的偏移.原来的static定位位置依然 ...
- CSS权威指南 - 浮动和定位 2
定位 定位的想法很简单元素框相对于正常位置出现在哪里. 定位:static,相对, 绝对, fixed, 继承 static就是默认的位置 相对就是相对于默认位置的偏移.原来的static定位位置依然 ...
- J2SE7规范_2013.2_类
8.1 类的定义 包括普通类和枚举类,枚举(略) 下面都是指普通类: public只能用于外部类,成员类,不能用于局部类,匿名类 protected和private用于成员类时(待解) sta ...
- PHP设计模式之工厂模式
工厂模式(Factory pattern)和单例模式一样,是另外一种创建型模式. 和单例模式不同的是,单例模式会创建和管理一个单独的类型的单一对象,工厂模式则是用于创建多种不同类型的类的多个对象. 工 ...
- multithreading coding
分类:公共资源问题.公交车问题 顺序:Qseater lab, bank, doctor [饭店] geust //yuec2 Yue Cheng package lab9; public abstr ...
- C++类成员函数
c++的两大特色是多态和模板.其中多态是通过继承和虚函数来实现的,其中虚函数是通过每个对象里面的虚表来实现的.如果这个对象的类有虚函数,那么这个类就有一张虚表,存的是每个虚函数的入口地址,而这个类的每 ...
随机推荐
- JDBC中的批处理
以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/batch-processing.html: 批处理是指将关联的SQL语句组合成一个批处理,并将他们当成 ...
- Servlet的会话(Session)跟踪
以下内容引用自http://wiki.jikexueyuan.com/project/servlet/session-tracking.html: HTTP是一种“无状态”协议,这意味着每次客户端检索 ...
- 使用Java快速开发博客、官网等偏内容型网站-IDEA篇-MCMS
分享快乐 由于官网提供的是eclipse的教学视频,清晰度感人,看得我就一个纳闷,反复的看,反复检查,就是不行,然后天真的寻觅帮助,反复查看文档依旧凉凉.最后放弃,转战idea.特此篇,希望能帮助到各 ...
- 请问这个「 (?<=<(\w+)>).*(?=<\/\1>) 」正则表达式是什么意思呢?
问题:https://www.zhihu.com/question/26480812 (?<=<(\w+)>).*(?=<\/\1>) ---------------- ...
- jQuery异步框架探究1:jQuery._Deferred方法
jQuery异步框架应用于jQuery数据缓存模块.jQuery ajax模块.jQuery事件绑定模块等多个模块,是jQuery的基础功能之中的一个.实际上jQuery实现的异步回调机制能够看做ja ...
- RHEL6.5上Oracle ACFS与Linux samba一起使用时遇到的bug
RHEL上的Oracle ACFS与linux samba一起使用时遇到的bug 一.环境介绍: cat /etc/issue的结果为: Red Hat Enterprise Linux Server ...
- Jmeter技巧
Jmeter参数化的4种方法 用Jmeter测试时包含两种情况的参数,一种是在url中,一种是请求中需要发送的参数. URL中的参数,如:http://blog.da-fang.com/index.p ...
- 【bzoj4591】[Shoi2015]超能粒子炮·改
设S(n,k)=Σ C(n,i) i=0..k 根据lucas定理可以得到 S(n,k) mod p = [ S(n/p,k/p-1)*S(n mod p,p-1)+C(n/p,k/p)*S(n mo ...
- cordova常用命令
安装 cordova: npm install -g cordova 创建应用程序 cordova create hello com.example.hello HelloWorld 添加平台 cor ...
- bzoj3670 [Noi2014]动物园——KMP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3670 第一次写KMP算法...又T又WA了半天... 1. num 数组表示包括其本身的前缀 ...