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 相关文章推荐
非常不错的MySQL优化的8条经验
Mar 24 PHP
wiki-shan写的php在线加密的解密程序
Sep 07 PHP
PHP 命令行参数详解及应用
May 18 PHP
php下通过IP获取地理位置的代码(小偷程序)
Jun 09 PHP
header导出Excel应用示例
Jan 24 PHP
PHP中的use关键字概述
Jul 23 PHP
php中用memcached实现页面防刷新功能
Aug 19 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
Jul 29 PHP
PHP入门教程之PHP操作MySQL的方法分析
Sep 11 PHP
mysql alter table命令修改表结构实例详解
Sep 24 PHP
完美的php分页类
Oct 24 PHP
PHP 实现base64编码文件上传出现问题详解
Sep 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
一个PHP并发访问实例代码
2012/09/06 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
PHP实现移除数组中为空或为某值元素的方法
2017/01/07 PHP
PHP实现时间比较和时间差计算的方法示例
2017/07/24 PHP
js的表单操作 简单计算器
2011/12/29 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
JS数组去重与取重的示例代码
2014/01/24 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
浅析函数声明和函数表达式——函数声明的声明提前
2016/05/03 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
2019/01/06 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
python字典多条件排序方法实例
2014/06/30 Python
python通过post提交数据的方法
2015/05/06 Python
以windows service方式运行Python程序的方法
2015/06/03 Python
python登录豆瓣并发帖的方法
2015/07/08 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
Python3基于plotly模块保存图片表格
2020/08/03 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
中文专业自荐书
2014/06/29 职场文书
技术股份合作协议书
2014/10/05 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
华山导游词
2015/02/03 职场文书
2019年个人工作总结范文(3篇)
2019/08/27 职场文书
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏