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 相关文章推荐
用 PHP5 轻松解析 XML
Dec 04 PHP
PHP Header用于页面跳转要注意的几个问题总结
Oct 03 PHP
php 变量定义方法
Jun 14 PHP
php学习笔记 数组的常用函数
Jun 13 PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
20个2014年最优秀的PHP框架回顾
Oct 22 PHP
PHP实现的简单异常处理类示例
May 04 PHP
thinkphp3.2嵌入百度编辑器ueditor的实例代码
Jul 13 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
Feb 06 PHP
PHP递归算法的简单实例
Feb 28 PHP
PHP与Perl之间知识点区别整理
Mar 19 PHP
phpcmsv9.0任意文件上传漏洞解析
Oct 20 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
理解PHP5中static和const关键字的区别
2007/03/19 PHP
PHP 错误之引号中使用变量
2009/05/04 PHP
php实现的CSS更新类实例
2014/09/22 PHP
php异常处理方法实例汇总
2015/06/24 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
Javascript与flash交互通信基础教程
2008/08/07 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
vuex state及mapState的基础用法详解
2018/04/19 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
Python中的闭包实例详解
2014/08/29 Python
python+mysql实现简单的web程序
2014/09/11 Python
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
Python的re模块正则表达式操作
2016/05/25 Python
pyqt5 从本地选择图片 并显示在label上的实例
2019/06/13 Python
Django REST framework 分页的实现代码
2019/06/19 Python
python无序链表删除重复项的方法
2020/01/17 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
HEMA英国:荷兰原创设计
2018/08/28 全球购物
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
配置管理计划的主要内容有哪些
2014/06/20 面试题
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
个人整改措施落实情况汇报
2014/10/29 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
运动会通讯稿300字
2015/07/20 职场文书