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&amp;java(二)
Oct 09 PHP
php对称加密算法示例
May 07 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
Sep 16 PHP
PHP贪婪算法解决0-1背包问题实例分析
Mar 23 PHP
Laravel 5 框架入门(一)
Apr 09 PHP
PHP滚动日志的代码实现
Jun 10 PHP
php自定义类fsocket模拟post或get请求的方法
Jul 31 PHP
Symfony2在Nginx下的配置方法图文教程
Feb 04 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
Laravel如何使用Redis共享Session
Feb 23 PHP
php 使用expat方式解析xml文件操作示例
Nov 26 PHP
如何利用PHP实现上传图片功能详解
Sep 24 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
15种PHP Encoder的比较
2007/04/17 PHP
DEDE采集大师官方留后门的删除办法
2011/01/08 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
JQuery中each()的使用方法说明
2010/08/19 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
Bootstrap实现水平排列的表单
2016/07/04 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
CentOS6.5设置Django开发环境
2016/10/13 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
python全栈知识点总结
2019/07/01 Python
Django模板Templates使用方法详解
2019/07/19 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
《可爱的动物》教学反思
2014/02/22 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
企业文化口号
2014/06/12 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
故宫英文导游词
2015/01/31 职场文书
学习商务礼仪心得体会
2016/01/22 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书