详解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单例模式之继承碰见的问题相关推荐

  1. php单例模式demo,PHP单例模式demo详解

    本文主要和大家分享PHP设计模式之单例模式demo,希望能帮助大家更好的学习PHP单例模式.<?php /** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * 构造 ...

  2. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  3. Maven详解之聚合与继承

    Maven详解之聚合与继承 说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各 ...

  4. python的继承用法_python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  5. python中类的构成_Python中类型关系和继承关系实例详解

    本文详细介绍了Python中类型关系和继承关系.分享给大家供大家参考.具体分析如下: 如果一个对象A持有另一个对象B的ID,那么检索到A之后就可以检索到B,我们就说存在一个A到B的导航.这种导航关系使 ...

  6. 详解js中的继承(一)

    详解js中的继承(一) 前言 准备知识 1.构造函数,实例 2.原型对象 3.构造函数,原型对象和实例的关系 继承 原型链 小结 前言 通过[某种方式]让一个对象可以访问到另一个对象中的属性和方法,我 ...

  7. 详解python单例模式

    单例模式提供了一个类只有一个特定类型的对象的机制. 通俗一点地来说,单例模式就是说通过一个类实例的所有对象都是同一个对象,它们拥有相同的地址,相同的属性及方法,操作其中一个对象,其他的对象也会随之改变 ...

  8. php 单例模式原理,PHP单例模式demo详解

    本文主要和大家分享PHP设计模式之单例模式demo,希望能帮助大家更好的学习PHP单例模式.<?php /** * 设计模式之单例模式 * $_instance必须声明为静态的私有变量 * 构造 ...

  9. python3类的继承详解_python3中类的继承以及self和super的区别详解

    python中类的继承: 子类继承父类,及子类拥有了父类的 属性 和 方法. python中类的初始化都是__init__().所以父类和子类的初始化方式都是__init__(),但是如果子类初始化时 ...

最新文章

  1. Cascade RPN,结构的艺术带来极致提升 | NeurIPS 2019
  2. 信息系统项目管理师-项目采购管理核心知识点思维脑图
  3. 成为Java流大师–第1部分:创建流
  4. 单例模式的八种写法比较
  5. linux 参数扩展,Shell Bash 中的参数扩展
  6. java excel 晒新年操作_JAVA使用POI操作excel
  7. arraylist插入数据_集合系列 List(二):ArrayList
  8. 红帽企业存储管理之iscsi简单应用
  9. 软考-中级-网络工程师-2021年下半年-上午真题整理
  10. solidworks2016详细安装教程
  11. NumPy的详细教程
  12. NB-IOT之一个完整的BC95 UDP从开机到数据发送接收过程
  13. 常用计算机英文缩写,常用计算机英文缩写含义
  14. Matlab 制作常用图片的代码
  15. Java混元功法_陈式太极心意混元 入门功法---太极内功 1
  16. html和php网站哪个好,HTML和PHP网站设计实例
  17. C# Lambda 表达式
  18. android开发中对图片的处理方式汇总
  19. 解决每次上线更新文件需要手动清除缓存的问题-------js 、css自动清除浏览器缓存方法
  20. 基于FPGA等精度的实时测量频率和占空比

热门文章

  1. redux常见问题答疑
  2. vijos 1030 重叠的方框
  3. Pwnium CTF2014 – MatterOfCombination writeup
  4. ios unrecognized selector sent to instance出现的原因和解决方案
  5. javascript中select的常用操作
  6. 玻璃质感_他的玻璃质感让人佩服的五体投地
  7. clion配置_Ubuntu16.04系统下用CLion编译器调试ROS代码详细教程
  8. 阻塞io阻塞io_Redis:RESP协议,阻塞IO 与非阻塞IO,Redis的线程模型
  9. python not函数_python 函数
  10. com口驱动_手机都没耳机口了,平衡口现在才来是作死还是?