PHP顶用Trait封装单例模式的实现
单例模式的界说
确保某一个类只有一个实例,不能反复实例,只能它本身实例化,而且向整个系统供给这个实例。
解决的问题
即一个类只被实例化一次,当其他人对其再次实例化时,返回第一次实例化的东西,可以制止大量的 new 操纵,减少资源的消耗。
原则:四步走,三私一公
私有化静态属性
私有化结构要领
私有化克隆要领
公有化静态要领
封装配景
当项目中有多个单例类,每新建一个类,都得做三私一公的界说,就显得有些做反复事情了,不只仅浪费时间浪费精力,而且代码痴肥且难维护,有没有 更优雅 的写法呢?
Trait来封装单例
php从以前到此刻一直都是单担任的语言,无法同时从两个基类中担任属性和要领,为了解决这个问题,php出了Trait这个特性
用法: 通过在类中使用 use 关键字,声明要组合的 Trait 名称,具体的 Trait 的声明使用 Trait关键词,qq空间破解访问权限网页版
,Trait不能被实例化。
Code示例
创建一个Trait
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
<?php /** * Trait Singleton 单例模式 */ Trait Singleton { private static $instance = null; private function __construct() { parent::__construct(); // 私有化结构要领 } private function __clone() { // 私有化克隆要领 } public function __sleep() { //重写__sleep要领,将返回置空,防备序列化反序列化获得新的东西 return []; } public static function getInstance() { if (!isset(self::$instance)) { self::$instance = new static();//这里不能new self(),self和static区别 } return self::$instance; } }
多担任用法
其他类只用在代码中 use Singleton; ,即可担任单例了
1 2 3 4 5 6 7 8 9 10 11 12 13
<?php /** * Desc: 业务类1 担任实例 */ class YieWu1 { use Singleton; // 关键一行代码 public function getInfo(){ // 业务代码 } }
1 2 3 4 5 6 7 8 9 10 11 12 13
<?php /** * Desc: 业务类2 担任实例 */ class YieWu2 { use Singleton; // 关键一行代码 public function getInfo(){ // 业务代码 } }
实列挪用
1 2
YieWu1::getInstance()->getInfo(); YieWu2::getInstance()->getInfo();
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/27327.html
- 上一篇:每个节点上都可以应用一个或多个taint
- 下一篇:做出来的成品设计完全基于原创