浅谈PHP面向对象编程(九、设计模式)

摘要:
设计模式就像一本经典的象棋书。本节将详细解释PHP应用程序中最常用的两种设计模式。
9.0 设计模式

  在编写程序时经常会遇到一此典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,在大量的实践中总结和理论化之后优选的代码结构编程风格,以及解决问题的思考方式。

设计模式就像是经典的棋谱。不同的棋局,使用不同的棋谐,免得自己再去思考和模索。本节将针对PHP应用程序中最常用的两种设计模式进行详细讲解。

9.1 单例模式


   单例模式是PHP中的一种设计模式,它是指在设计一个类时,需要保证在整个程序运行期间针对该类只存在一个实例对象。

就像世界上只有一个月亮,假设现在要设计一个类表示月亮,该类只能有一个实例对象,否则就违背了事实。

在讲解单例设计模式之前,通过一个案例来演示在什么情况时需要使用单例模式,如例9-23 所示

例9-2

 1 <?php
 2      class dbHelper{
 3          private $conn = null;
 4          public function __construct(){            
 5            //打开一个到 MySQL 服务器的连接
 6            $this->conn = mysql_connect("localhost","root","");
 7            echo "得到一个conn<br/>";
 8         }
 9     }
10     $db1 = new dbHelper();
11     $db2 = new dbHelper();
12     if($db1 === $db2){
13         echo "一个对象<br/>";
14     } else {
15            echo "两个对象<br/>";
16     }
17 ?>

运行结果

得到一个conn

得到一个conn

两个对象

从上例中可以看出,实例化类dbHelper的两个对象请求的数据库连接是两个不同的连接,而在实际开发中,有时会有这样的需求,

在一次HTTP 请求中,保证某个类的对象实例只能有一个。这样可以节省资源开销,此时可以使用单例模式。

      单例模式(Singleton)用于为一个类生成一个唯一的对象。(请记住名词    “”三私一公“”)

私有静态属性

私有构造方法

私有克隆方法

公有静态调用队象方法 

将上面的dbHelper 类使用单例模式来实现,如例9-24所示

例9-24

<?php
    class dbHelper{
        private static $instance = null;//定义一个私有的静态属性$instance
        //声明一个构造方法    
        private function __construct(){
            $this->conn = mysql_connect("localhost","root","");
            echo "得到一个conn<br/>";
        }
        //只有通过这个方法才能返回本类的对象,该方法是静态方法
        public static function getInstance(){
            //如果本类中的$instance为空,说明它还没有被实例化过
            if(self::$instance == null){
                self::$instance = new self();//实例化本类对象
            }
            return self::$instance;//返回本类的对象
        }
        //阻止用户复制对象实例
        public function __clone(){
        }
    }
    $db1 = dbHelper::getInstance();
    $db2 = dbHelper::getInstance();
    if($db1 === $db2){
        echo "同一个对象";
    }else{
        echo "不是同一个对象";
    }
?>

运行结果

得到一个conn

同一个对象

在上例中,dbHelper类的构造方法使用了private 关键字进行了修饰,即不能在类定义之外使用new来创建对象。

如此一来就只能通过类 名直接调用getinstance0静态方法来创建对象。在第3行代码声明了一个私有的静态属性$instance.

将实例化的对象赋值给它,再判断该属性,如果已经有值,就直接返回,如果其值为null, 就先实例化对象,这样就能保证dbHelper类只能被实例化一次。

最后增加了一个私有的魔术方法_ clone0. 用于防止用户通过clone方法复制对象。

 9.2 工厂模式


工厂模式的作用就是“生产”对象。工厂方法的参数是要生成对象的类名。

为了方便理解工厂模式的作用,接下来通过一个案例来演示如何使用工厂模式获取MySQL和sQLite的驱动对象。

首先在根目录下创建MySQLphp文件。示例代码如下:

1 <?php
2     class  MySQL{
3 
4              //操作SQL的驱动类
5 
6     }

然后在根目录下创建SQLite.php文件。示例代码如下:

1 <?php
2 class SQLite{
3 
4 //操作SQLite的驱动类
5 
6 }

 最后定义一个工厂方法来获取各驱动对象,代码如例9-25所示

例9-25

 1 <?php
 2      header('Content-Type: textml;charset=utf-8');
 3      class Db{
 4          //工厂方法
 5          public static function factory($type){
 6            if (include_once  $type . '.php') {
 7                 $classname =  $type;
 8                 return new $classname();
 9            } else {
10                 echo "出错了!";
11            }
12         }
13     }
14     //获取MySQL驱动对象
15     $mysql = Db::factory('MySQL');
16      //获取SQLite驱动对象
17     $sqlite = Db::factory('SQLite');
18     var_dump($mysql);
19     var_dump($sqlite);
20 ?>  

 运行结果

object (MySQL) [1]

object (SQLite) [2]

上例中,第5行代码定义了一个静态方法factor(), 这就是工厂方法,该方法的参数为类名。

第6- 11行代码用于判断类名与参数是否相同,如果相同则创建该类的对象,否则输出“出错了!”。

第15 17行代码分别调用factory()方法获取对应的驱动对象。

从运行结果可以看出,工厂方法成功地创建了两个驱动类对象。

免责声明:文章转载自《浅谈PHP面向对象编程(九、设计模式)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle学习第一天【简单操作】四个有害的Java编码习惯下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PHP实现执行定时任务的几种思路详解

Linux服务器上使用CronTab定时执行php我们先从相对比较复杂的服务器执行php谈起。服务器上安装了php,就可以执行php文件,无论是否安装了nginx或Apache这样的服务器环境软件。而Linux中,使用命令行,用CronTab来定时任务,又是绝佳的选择,而且也是效率最高的选择。 首先,进入命令行模式。作为服务器的linux一般都默认进入命...

PHP 真正多线程的使用

popen 首先popen()函数创建一条管道,方向为父进程的fpout到子进程的stdin,接着popen程序打开in.txt文本并一行一行地读取出来写到管道的fpout端。子进程则从stdin中读取从父进程发送过来的数据显示到stdout中。 PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程。多线程在处理重...

天网计划 php skymvc框架

简介:这是天网计划 php skymvc框架的详细页面,介绍了和php,有关的知识、技巧、经验,和一些php源码等。 frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=339493' scrolling='no'>skymvc是一款轻量、简单的phpmvc框架,借鉴了各大...

PHPDoc/PHPDocumentor生成API文档

PHPDocumentor是一个用PHP写的强大的文档自动生成工具,对于有规范注释的php程序,能够快速生成具有结构清晰、相互参照、索引等功能的API文档。旧版本是PHPDoc,PHPDoc是PEAR下面的一个非常优秀的模块,类似于Javadoc。从1.3.0开始,更名为phpDocumentor,新版本新加了对php5语法的支持,同时,可以通过在客户端浏...

linux 系统 解决php -v查看到版本于phpinfo()打印的版本不一致问题

发现问题的原因:   安装zip扩展后,配置成功,但是使用gitlab合并的时候发生错误,经检查,使用phpinfo打印出来的php版本为7.1,而使用linux度服务器 运行 php -v的版本却是5.4,故怀疑加载的php.ini文件不一致 解决方案        首先查找一下linux上有几个php.ini。结果发现有两个:       使用命令来查...

SQLite本地轻量化数据库使用配置(全套)===》Net

1.NuGet管理包引用3个文件 NuGet管理包搜索引用System.Data.SQLite 作者:SQLite Development Team,自动引用3个文件 2.DbHelperSQLite帮助类(注意更换namespace demo2) using System; using System.Collections; using System....