继承单例模式 php_详解PHP单例模式之继承碰见的问题
详解PHP单例模式之继承碰见的问题<?php
// 单例模式之继承
class Singleton
{
protected static $ins = null;
private final function construct() { }
protected final function clone() { }
// public static function getIns() {
// if(self::$ins === null){
// self::$ins = new self();
// }
// return self::$ins;
// }
public static function getIns() {
if(static::$ins === null){
static::$ins = new static();
}
return static::$ins;
}
}
class Child extends Singleton
{
// protected static $ins = null;
}
/*
输出结果为:
bool(true) object(Singleton)#1 (0) { }
问题:对象 $c1, $c2 竟然都是 Singleton 的实例 ???
解决方法:将 getIns() 方法中关键字 self 替换为 static, 利用后期静态绑定的特性
*/
$c1 = Child::getIns();
$c2 = Child::getIns();
var_dump($c1 === $c2); //true
var_dump($c1);
// ------------------------------------------------------------------------
// 另一个问题
/*
输出结果为:
bool(true) object(Child)#1 (0) { }
问题:对象 $c3 竟然是 Child 的实例, 实际上应该是 Singleton 的实例 ???
原因:因为 $ins 属性是从父类 Singleton 继承过来的, 当第一次调用 Child::getIns() 时, $ins = new Child()
当再次调用 Singleton::getIns() 时, $ins 已经被实例过了, 而且指向 Child 的实例,
所以此时 $c3 变成了 Child 的实例
解决方法:在 Child 类中, 声明自己独有的 $ins 属性
*/
$c3 = Singleton::getIns();
var_dump($c1 === $c3);
var_dump($c3);
后期静态绑定的 getIns() 方法还会有一个问题:
若 Singleton 的 $ins 属性被设置为 private 的,子类 Child 必须设置自己的 $ins 属性,
因为 static::$ins 优先寻找子类自己的 $ins 属性,但由于子类没有声明且父类的不能继承,此时调用 Child::getIns()
方法便会报错:
Fatal error: Cannot access property Child::$ins in D:\wamp\www\mycode\DesignPattern\Singleton.php on line 27
解决方法:
将父类 Singleton 的 $ins 属性设置为 protected 的 或者 设置子类 Child 自己的 $ins 属性
继承单例模式 php_详解PHP单例模式之继承碰见的问题相关推荐
- php单例模式demo,PHP单例模式demo详解
本文主要和大家分享PHP设计模式之单例模式demo,希望能帮助大家更好的学习PHP单例模式.<?php /** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * 构造 ...
- python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解
本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...
- Maven详解之聚合与继承
Maven详解之聚合与继承 说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各 ...
- python的继承用法_python中继承有什么用法?python继承的用法详解
本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...
- python中类的构成_Python中类型关系和继承关系实例详解
本文详细介绍了Python中类型关系和继承关系.分享给大家供大家参考.具体分析如下: 如果一个对象A持有另一个对象B的ID,那么检索到A之后就可以检索到B,我们就说存在一个A到B的导航.这种导航关系使 ...
- 详解js中的继承(一)
详解js中的继承(一) 前言 准备知识 1.构造函数,实例 2.原型对象 3.构造函数,原型对象和实例的关系 继承 原型链 小结 前言 通过[某种方式]让一个对象可以访问到另一个对象中的属性和方法,我 ...
- 详解python单例模式
单例模式提供了一个类只有一个特定类型的对象的机制. 通俗一点地来说,单例模式就是说通过一个类实例的所有对象都是同一个对象,它们拥有相同的地址,相同的属性及方法,操作其中一个对象,其他的对象也会随之改变 ...
- php 单例模式原理,PHP单例模式demo详解
本文主要和大家分享PHP设计模式之单例模式demo,希望能帮助大家更好的学习PHP单例模式.<?php /** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * 构造 ...
- python3类的继承详解_python3中类的继承以及self和super的区别详解
python中类的继承: 子类继承父类,及子类拥有了父类的 属性 和 方法. python中类的初始化都是__init__().所以父类和子类的初始化方式都是__init__(),但是如果子类初始化时 ...
最新文章
- Cascade RPN,结构的艺术带来极致提升 | NeurIPS 2019
- 信息系统项目管理师-项目采购管理核心知识点思维脑图
- 成为Java流大师–第1部分:创建流
- 单例模式的八种写法比较
- linux 参数扩展,Shell Bash 中的参数扩展
- java excel 晒新年操作_JAVA使用POI操作excel
- arraylist插入数据_集合系列 List(二):ArrayList
- 红帽企业存储管理之iscsi简单应用
- 软考-中级-网络工程师-2021年下半年-上午真题整理
- solidworks2016详细安装教程
- NumPy的详细教程
- NB-IOT之一个完整的BC95 UDP从开机到数据发送接收过程
- 常用计算机英文缩写,常用计算机英文缩写含义
- Matlab 制作常用图片的代码
- Java混元功法_陈式太极心意混元 入门功法---太极内功 1
- html和php网站哪个好,HTML和PHP网站设计实例
- C# Lambda 表达式
- android开发中对图片的处理方式汇总
- 解决每次上线更新文件需要手动清除缓存的问题-------js 、css自动清除浏览器缓存方法
- 基于FPGA等精度的实时测量频率和占空比
热门文章
- redux常见问题答疑
- vijos 1030 重叠的方框
- Pwnium CTF2014 – MatterOfCombination writeup
- ios unrecognized selector sent to instance出现的原因和解决方案
- javascript中select的常用操作
- 玻璃质感_他的玻璃质感让人佩服的五体投地
- clion配置_Ubuntu16.04系统下用CLion编译器调试ROS代码详细教程
- 阻塞io阻塞io_Redis:RESP协议,阻塞IO 与非阻塞IO,Redis的线程模型
- python not函数_python 函数
- com口驱动_手机都没耳机口了,平衡口现在才来是作死还是?