植物百科网
当前位置: 首页 农业百科

php设计模式讲解(详解PHP中的三大经典模式)

时间:2023-05-23 作者: 小编 阅读量: 1 栏目名: 农业百科

单例模式使用的场景:1.数据库操作,减少对数据路的new操作,从而减少内存资源和系统资源的消耗。工厂模式的意义:通过使用工厂模式,减少因为多处new同一个类,当这个类发生变法时,则需要多处修改。存在则返回对象,不存在则创建对象并返回。工厂模式更多考虑的是扩展维护的问题。总的来说,单例模式和工厂模式可以产生更加合理的对象。而且在项目内如此建立的对象好像散兵游勇一样,不便统筹管理安排啊。因而,注册树模式应运而生。

php设计模式讲解?单例模式单例模式的含义:,我来为大家科普一下关于php设计模式讲解?以下内容希望对你有帮助!

php设计模式讲解

单例模式

单例模式的含义:

作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。

单例模式的三个要素:

1. 保存类唯一实例的静态变量。

2. 构造函数和克隆函数必须是私有的,放在外部去实例化,这样就不存在单例模式的意义。

3. 提供一个可供外部访问的公共静态方法,这个方法返回该类的唯一实例。

单例模式的意义:

在 PHP 中的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时, 如果使用单例模式, 则可以避免大量的 new 操作消耗的资源。而不完全是对系统资源的节省, 可以避免重复实例化,因为 PHP 每次实例化一个类之后都会清理掉对应的资源,当再次使用的时候又会在重新去实例化一次。

单例模式使用的场景:

1. 数据库操作,减少对数据路的 new 操作,从而减少内存资源和系统资源的消耗。

2. 配置资源的共享,在一个系统中,配置资源都是全局的,使用单例模式也可以减少每次去读取配置带来的内存和系统资源的消耗。

代码演示:

<?php

class Single

{

public static $attribute = '';

public static $instance = '';

private function __construct($attribute = '个人技术')

{

self::$attribute = $attribute;

}

public static function getInstance($attribute = '我是编程浪子走四方1')

{

if (!(self::$instance instanceof self)) self::$instance = new self($attribute);

return self::$instance;

}

}

单例模式和非单例模式的区别:

class Single {

public function index() {

return '';

}

}

$Single1 = new Single();

$single2 = new Single();

var_dump($single1);

var_dump($single2);

if ($single2 === $single1) {

echo "是同一个对象";

} else {

echo "不是同一个对象";

}

// object(Single)#1 (0) {

// }

// object(Single)#2 (0) {

// }

// 不是同一个对象

class single2 {

// 1.声明一个静态属性,用户保存类的实例

public static $instance;

//3. 将构函数私有化,避免外部new(每new一次,就不是同一个实例)

private function __construct() {

}

// 2.声明一个静态的公共方法,用户外部调用本类的实例

public static function getInstance() {

if (!(self::$instance instanceof self)) {

self::$instance = new self;

}

return self::$instance;

}

//3. 克隆函数私有化,避免外部clone(每clone一次,就不是同一个实例)

private function __clone() {

}

}

$singleDemo1 = Single2::getInstance();

$singleDemo2 = Single2::getInstance();

var_dump($singleDemo1->getInstance());

var_dump($singleDemo2->getInstance());

if ($singleDemo1 === $singleDemo2) {

echo "是同一个对象";

} else {

echo "不是同一个对象";

}

// object(Single2)#3 (0) {

// }

// object(Single2)#3 (0) {

// }

// 是同一个对象

工厂模式

工厂模式的有含义:

负责生成其他对象的方法。简单的描述就是通过一个工厂类,去实例化其他类或者方法。

工厂模式的意义:

通过使用工厂模式,减少因为多处 new 同一个类,当这个类发生变法时,则需要多处修改。

代码演示:

<?php

class Factor

{

public static function createDB()

{

echo '我生产了一个DB实例';

return new DB;

}

}

class DB

{

public function __construct()

{

echo __CLASS__ . PHP_EOL;

}

}

$db = Factor::createDB();

注册树模式

注册数的含义:

注册树就是将多个对象注册在一个对象池中,当我们需要使用时,直接从对象池获取即可。

注册数模式的优点:

单例模式解决的是如何在整个项目中创建唯一对象实例的问题,工厂模式解决的是如何不通过 new 建立实例对象的方法。

那么注册树模式想解决什么问题呢? 在考虑这个问题前,我们还是有必要考虑下前两种模式目前面临的局限。

首先,单例模式创建唯一对象的过程本身还有一种判断,即判断对象是否存在。存在则返回对象,不存在则创建对象并返回。

每次创建实例对象都要存在这么一层判断。

工厂模式更多考虑的是扩展维护的问题。

总的来说,单例模式和工厂模式可以产生更加合理的对象。怎么方便调用这些对象呢?

而且在项目内如此建立的对象好像散兵游勇一样,不便统筹管理安排啊。因 而,注册树模式应运而生。

不管你是通过单例模式还是工厂模式还是二者结合生成的对象,都统统给我 “插到” 注册树上。我用某个对象的时候,直接从注册树上取 一下就好。

这和我们使用全局变量一样的方便实用。 而且注册树模式还为其他模式提供了一种非常好的想法。

代码演示:

<?php

/**

* 单例模式

*/

class Single

{

public static $attribute = '';

public static $instance = '';

private function __construct($attribute = '个人技术')

{

self::$attribute = $attribute;

}

public static function getInstance($attribute = '个人技术1')

{

if (!(self::$instance instanceof self)) self::$instance = new self($attribute);

return self::$instance;

}

}

/**

* 工厂模式

*/

class Factory

{

public static function createObj()

{

return Single::getInstance('个人技术');

}

}

/**

* 注册模式

* 含义:就是将对象放在一个对象池中,使用的时候直接去对象池查找.

* 需要如下几个操作:

* 1.注册

* 2.存放对象池

* 3.获取

* 4.销毁

*/

Class Register

{

// 用一个数组来当做对象池,键当做对象别名,值存储具体对象

public static $objTree = [];

// 将对象放在对象池

public static function set($key, $val)

{

return self::$objTree[$key] = $val;

}

// 通过对象别名在对象池中获取到对象别名

public static function get($key)

{

return self::$objTree[$key];

}

// 通过对象别名将对象从对象池中注销

public static function _unset($key)

{

unset(self::$objTree[$key]);

}

}

Register::set('single', Factory::createObj());

$single = Register::get('single');

print_r($single);

echo $single::$attribute;

    推荐阅读
  • 荣耀战魂steam启动游戏提示激活怎么办(steam买的荣耀战魂怎么激活)

    荣耀战魂目前在UBISOFT和steam上面都可以玩,而很多玩家在UBISOFT里面下载了游戏,然后在steam里面添加该游戏,却发现启动不了提示需要激活金钥。steam启动UBI客户端游戏提示激活解决教程:关闭uplay然后不开的情况下用steam启动游戏,uplay会自动同步云,然后就好了。或者管理员模式运行steam,然后不要用管理员模式运行游戏就可以了。

  • 麻辣小龙虾要准备些什么(别再一个一个刷小龙虾了)

    麻辣小龙虾要准备些什么?麻辣小龙虾要准备些什么已经立夏,也就是说马上要进入夏天了,请随时准备好迎接高温的天气吧,虽然不喜欢夏天的烈日,但是对于吃货来说,夏天的美食却是非常多的,特别是小龙虾在今年上市更早一些,可是外边夜市摊上的小龙虾大家都觉得不太干净,更喜欢自己在家中吃,但是自己在洗小龙虾的时候,相信很多人都会拿着一个小刷子,一个一个去刷洗小龙虾,其实学夜市摊老板这样做,洗得又快又干净!

  • 2022年退休人员养老金有什么变化(1954年出生的退休人员)

    从女性的年龄来计算,50岁退休的主要是生产一线的职工,大部分人从事的是体力劳动,按照计发月数195个月来计算,计算出来的平均年龄是66.25岁左右,这和从事体力劳动的平均年龄是基本吻合的;55岁退休的主要是干部和管理技术人员,个人账户养老金计发月数是170个月,也就是14.16年,这样计算的平均年龄是69.16岁。

  • 儿童孤独症的预防与矫治(6岁儿童孤独症筛查干预服务规范)

    下面更多详细答案一起来看看吧!儿童孤独症的预防与矫治来源:孤独症儿童很少主动与他人对视,不爱与外界接触犹如天上星星,一人一世界因此,他们也被称作来自“星星的孩子”

  • 论文选题可以从以下几个方面入手(论文选题一般都分为哪几种类型)

    通常,它是预先详细规定的,并由高级研究人员应用和组织。这种类型的主题选择通常相对“小”,资金较少。需要强调的一点是,主题选择“小”是相对于多级主题系统而言的,这通常意味着主题选择范围是单一的,并且论文可以是单篇论文。但是,这并不意味着研究的价值很小。

  • 怎样禁止小孩浏览不明网站(违反道德内容引民众反对)

    怎样禁止小孩浏览不明网站近日,美国《纽约时报》等多家媒体报道称,全球最大的色情网站“Pornhub”一直存在上传非法或严重违反道德的视频内容。上周,《纽约时报》的一篇评论文章再次批评Pornhub仍含有大量强暴、偷拍、种族主义、虐待等内容的视频。文章刊登后不久,支付渠道服务商万事达和维萨宣布暂停为Pornhub提供服务。面对谴责之声,Pornhub近日回应称,网站将组建专业审查团队对违法内容进行打击。

  • 劣质纸尿裤排名(全国纸尿裤抽检报告)

    抽检结果显示,当前市面上的纸尿裤渗透性能总体合格率非常高。结果显示,受检样品均未检出。纸尿裤接触的是人体的私密部位,一旦卫生标准不合格,则容易感染皮肤,引发炎症。此外,还有2款产品检出pH值不合格。pH值是考核纸尿裤亲肤程度的重要指标。使用pH值不达标的纸尿裤产品,可能破坏肌肤表层的皮脂膜,引起肌肤不适,甚至导致细菌入侵。

  • 培训心态决定一切(是每个培训师的必修课)

    由此可见,闭关是一个人走向卓越的必经之路。根据闭关的任务,选择不同的地点,更加有益于闭关任务的达成。每年可以去照一些商务照,让自己保持一个全新的一个形象。有的培训师相片已经有多年没有更新了,定期去拍一组商务照,及时更新自己。

  • 烤蘑菇方法(这样烤的蘑菇香软可口)

    蘑菇去根,洗干净备用烤盘铺上油纸,把蘑菇放在上面,每只上面都撒上一点盐,接下来我们就来聊聊关于烤蘑菇方法?以下内容大家不妨参考一二希望能帮到您!烤蘑菇方法蘑菇去根,洗干净备用。烤箱预热,放入蘑菇180度上下火烤15分钟。把蘑菇装盘就可以食用,记得要小心一点拿,尽量不要浪费了里面的汁,非常鲜美

  • 菜籽油适合儿童吃吗(但最好别给孩子吃)

    天然存在于牛羊等的脂肪组织和相关乳制品中的反式脂肪酸,一般不用担心,主要担心的是人造的,以及植物油遇到高温时发生反应所产生的反式脂肪酸。相比动物油来说,植物油会更健康。开始添加油后,首选富含富含α-亚麻酸的核桃油、亚麻籽油这类的植物油。