继承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++的两大特色是多态和模板.其中多态是通过继承和虚函数来实现的,其中虚函数是通过每个对象里面的虚表来实现的.如果这个对象的类有虚函数,那么这个类就有一张虚表,存的是每个虚函数的入口地址,而这个类的每 ...
随机推荐
- Ubuntu 16.04使用百度云的方案
Ubuntu没有很好的解决方案,都是一些投机取巧的方案: 1.不建议安装百度云客户端,尤其对于免费用户来说,会限制速度. 2.可以使用网页版进行文件上传. 3.下载可以通过Chrome点击下载后,复制 ...
- 基于Office 365 无代码工作流分析-数据源的建立!
标准操作步骤 下面整个步骤我们是以嘉昊信息的招聘过程的整个流程为一个场景,整个的流程场景的步骤例如以下: 整个的过程,我们通过Infopath 进行对应的表单流转,然后利用Sharepoint ...
- mac 查看python路径
1,terminal : input: which python 2, terminal: input : python --->import sys ----> print sys ...
- Appro DM8127 IPNC 挂载NFS遇到的问题及解决
对于Appro DM8127 IPNC,默认的启动方式是NAND is used for booting kernel and NAND is used as root filesystem 为了调试 ...
- python 三维坐标图
绘制3D柱状图,其数据格式为,二维数组或三维数组. from numpy import * file=open('C:\\Users\\jyjh\\Desktop\\count.txt','r') a ...
- ios33--线程通信
// // ViewController.m // 06-掌握-线程间通信 // // atomic:为set方法加锁,线程安全,需要消耗资源. // nonatomic:不为set方法加锁,非线程安 ...
- Probabilistic interpretation
Under the previous probabilistic assumptions on the data, least-squares regression corresponds to fi ...
- bzoj 3743: [Coci2015]Kamp【树形dp】
两遍dfs一遍向下,一边向上,分别记录子树内人数a,当前点到所有点的距离b,最大值c和次大值d,最大值子树p 然后答案是2b-c #include<iostream> #include&l ...
- bzoj 1783: [Usaco2010 Jan]Taking Turns【贪心+dp】
不知道该叫贪心还是dp 倒着来,记f[0][i],f[1][i]分别为先手和后手从n走到i的最大值.先手显然是取最大的,当后手取到比先手大的时候就交换 #include<iostream> ...
- bzoj 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛【dp】
写了个bfs发现MLE了... 设f[t][i][j]为在t时刻走到(i,j)的方案数,转移和bfs一样 #include<iostream> #include<cstdio> ...