0

0

php设计模式之单例模式学习

php中文网

php中文网

发布时间:2016-07-25 09:07:44

|

996人浏览过

|

来源于php中文网

原创

  1. class A{
  2. private function __construct(){}
  3. }
  4. $a = new A();
  5. ?>
复制代码

程序运行结果为: Fatal error: Call to private A::__construct() from invalid context in E:\PHPProjects\test.php on line 6

我们已经禁止外部用new实例化这个类,我们改如何让用户访问这个类呢?前门堵了,我们需要给用户留个后门。 解决办法是:static 修饰的方法,可以不经实例化一个类就可以直接访问这个方法。 //不能用new实例化的类.
//static的方法留给外部访问.
//在方法内部返回实例.

  1. class A{
  2. private function __construct(){}
  3. static function getClassA(){
  4. $a = new A();
  5. return $a;
  6. }
  7. }
  8. // 看到这里确实返回的是 A 的实例.但不是同一个对象.
  9. $a1 = A::getClassA();
  10. $a2 = A::getClassA();
  11. echo "\$a1 的类是 ".get_class($a1)." , \$a2 是 ".get_class($a1);
  12. if($a1 === $a2){
  13. echo "
    \$a1 \$a2 指向同一对象.";
  14. }else{
  15. echo "
    \$a1 \$a2 不是一个对象.";
  16. }
  17. ?>
复制代码

程序运行结果为: $a1 的类是 A , $a2 是 A $a1 $a2 不是一个对象.

我们已经通过static方法返回了a的实例。但还有问题。我们如何保证我们多次操作获得的是同一个实例的呢?

解决办法: static的属性在内部也只有一个。 static 属性能有效的被静态方法调用。将这个属性也设置成private,以防止外部调用。 先将这个属性设置成 null。每次返回对象前,先判断这个属性是否为 null 。 如果为 null 就创建这个类的新实例,并赋值给这个 static 属性。如果不为空,就返回这个指向实例的 static 属性。 //不能用new实例化的类.
//static的方法留给外部访问.
//在方法内部返回实例.
//定义静态属性保证这个实例能被静态方法调用.
//增加判断部分.

  1. class A{
  2. private static $a = null;
  3. private function __construct(){}
  4. static function getClassA(){
  5. if( null == self::$a){
  6. self::$a = new A();
  7. }
  8. return self::$a;
  9. }
  10. }
  11. // 看到这里确实返回的是 A 的实例.但不是同一个对象.
  12. $a1 = A::getClassA();
  13. $a2 = A::getClassA();
  14. echo "\$a1 的类是 ".get_class($a1)." , \$a2 是 ".get_class($a1);
  15. if($a1 === $a2){
  16. echo "
    \$a1 \$a2 指向同一对象.";
  17. }else{
  18. echo "
    \$a1 \$a2 不是一个对象.";
  19. }
  20. ?>
复制代码

程序运行结果为: $a1 的类是 A , $a2 是 A $a1 $a2 指向同一对象.

到此,我们写了一个最简单的单例模式 。 现在,你可以尝试写一个应用单例设计模式的数据库连接类。 要记住单例模式的使用效果和书写方式。

威客
威客

PHP威客系统威客贰系统是国内领先的威客网站内容管理系统,基于PHP+Mysql架构开发。整合UCHOME系统,系统内容模块由:威客悬赏,招标任务,人才库,人才,招聘,新闻资讯,在线支付,发贴推广,案例示范等多种功能组成。 威客贰系统独创的单人悬赏、 多人悬赏 、计件悬赏 、 定金招标、 本地招标为核心任务模式。超强的发贴推广可以分配到不同的任务模式不同的会员等级有不同的提成费用,根据网站自身需要

下载


相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

1

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

15

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

4

2026.01.13

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

5

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

ThinkPHP6.x API接口--十天技能课堂
ThinkPHP6.x API接口--十天技能课堂

共14课时 | 1.1万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 18.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号