PHP经典面试题之设计模式(经常遇到)


Posted in PHP onOctober 15, 2015

设计模式在面试过程中经常会提到,有时候还会让我们举例说明各种设计模式的应用场景。

使用设计模式可以减轻我们的工作量,优化我们的代码。

设计模式非常的多,这里介绍单例模式,工厂模式,组合模式,策略模式4种模式

如果有代码有什么问题或者有更好的方式请告知,谢谢!!!!!

/**
 * 单例模式
 * @author YangYang <1812271619@qq.com>
 * 可以想成在一次http请求中只产生该类的一个对象(即只new classname一次)
 * 经典的例子是数据库连接(redis,mongodb,memcache等)
 * 在一次http请求中我们可能需要对数据库做增删改查多条sql操作
 * 但是如果一次http请求中每执行一条sql我们就mysql_connect(),很明显会导致服务器资源的浪费
 * 为了节约资源,就可以通过单例模式来实现一次http请求只做一次mysql_connect()
 * 即将mysql_connect()放在类方法的__construct中,并将__construct方法做成私有,
 * 这样只能通过getInstance()方法来获得mysql_connect()的资源连接符
 * getInstance()方法中判断是否已经存在myql连接符,如果存在就直接返回该连接符
 * 否则new classname()即调用了__construct方法执行了mysql_connect()得到了资源连接符,并返回连接符
 * 因为现在PHP已不再建议直接使用mysql函数进行数据库操作,而是建议通过PDO进行数据库操作,所以这里写一个简易PDO连接的单例模式
 * 这里只是讲解单例原理,数据库的防sql注入等问题不做考虑
 * 准备工作 数据库:test 数据表:user 字段:id name 记录:1 CodeAnti
 * 最终运行结果: 数据表user中id=1这条记录被删除
 */
class SinglePDO
{
    private static $_instance = null;
    private $_pdo;
    //私有,防止外部直接实例化new SinglePDO(...)
    private function __construct($dsn,$dbUser,$dbPassword)
    {
        try{
            $this->_pdo = new PDO($dsn,$dbUser,$dbPassword);
            $this->_pdo->exec('set names utf8');
        }catch(PDOException $e){
            die("Error:{$e->getMessage()}");
        }
    }
    //私有,防止克隆
    private function __clone(){}
    //获取连接实例
    public static function getInstance($dsn,$dbUser,$dbPassword)
    {
        if(self::$_instance === null)
            self::$_instance = new self($dsn,$dbUser,$dbPassword);
        return self::$_instance;
    }
    //执行sql
    public function execSql($sql)
    {
        $result = $this->_pdo->exec($sql);
        return $result;
    }
}

$dsn = "mysql:host=localhost;dbname=test";
$dbUser = "root";
$dbPassword = "";
$sql = "delete from user where id = 1";
$pdo = SinglePDO::getInstance($dsn,$dbUser,$dbPassword);
$result = $pdo->execSql($sql); //$pdo->execSql($sql)多次调用,但仍然是同一个pdo对象
print_r($result);
PHP 相关文章推荐
PHP无敌近乎加密方式!
Jul 17 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
linux下实现定时执行php脚本
Feb 13 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 PHP
PHP中Restful api 错误提示返回值实现思路
Apr 12 PHP
PHP表单验证内容是否为空的实现代码
Nov 14 PHP
thinkPHP框架自动填充原理与用法分析
Apr 03 PHP
PHP迭代器和迭代的实现与使用方法分析
Apr 19 PHP
PHP常用日期加减计算方法实例小结
Jul 31 PHP
Laravel框架搜索分页功能示例
Feb 01 PHP
PHP面试题之文件目录操作
Oct 15 #PHP
php cli配置文件问题分析
Oct 15 #PHP
PHP+Mysql+jQuery实现发布微博程序 php篇
Oct 15 #PHP
10个php函数实用却不常见
Oct 13 #PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 #PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
Oct 13 #PHP
JavaScript与HTML结合的基本使用方法整理
Oct 12 #PHP
You might like
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
利用curl 多线程 模拟 并发的详解
2013/06/14 PHP
php使用GD库创建图片缩略图的方法
2015/06/10 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
2020/03/02 PHP
实现动画效果核心方式的js代码
2013/09/27 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
js控制input输入字符解析
2013/12/27 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
python 获取本机ip地址的两个方法
2013/02/25 Python
pandas创建新Dataframe并添加多行的实例
2018/04/08 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
django 修改server端口号的方法
2018/05/14 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
canvas中普通动效与粒子动效的实现代码示例
2019/01/03 HTML / CSS
中职生自荐信
2013/10/13 职场文书
销售心得体会
2014/01/02 职场文书
软件售后服务承诺书
2014/05/21 职场文书
空气环保标语
2014/06/12 职场文书
IT工程师岗位职责
2014/07/04 职场文书
房屋租赁协议书
2014/10/18 职场文书
2014年宣传部个人工作总结
2014/12/06 职场文书
北京英语导游词
2015/02/12 职场文书
运动会通讯稿100字
2015/07/20 职场文书
特种设备安全管理制度
2015/08/06 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
小学体育课教学反思
2016/02/16 职场文书
springboot项目以jar包运行的操作方法
2021/06/30 Java/Android
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android