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 相关文章推荐
模拟OICQ的实现思路和核心程序(一)
Oct 09 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
PHP 全角转半角实现代码
May 16 PHP
用来解析.htpasswd文件的PHP类
Sep 05 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
PHP加密解密实例分析
Dec 25 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
Sep 11 PHP
PHP设置images目录不充许http访问的方法
Nov 01 PHP
php实现水印文字和缩略图的方法示例
Dec 29 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
php利用fsockopen GET/POST提交表单及上传文件
May 22 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
Jul 13 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中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
php实现的农历算法实例
2015/08/11 PHP
PHPMailer发送邮件
2016/12/28 PHP
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
Python中os.path用法分析
2015/01/15 Python
python复制文件的方法实例详解
2015/05/22 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
Python多项式回归的实现方法
2019/03/11 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
Python调用REST API接口的几种方式汇总
2020/10/19 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
加拿大在线眼镜零售商:SmartBuyGlasses加拿大
2019/05/25 全球购物
师范生教师实习自我鉴定
2013/09/27 职场文书
生产车间主管岗位职责
2013/12/28 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
文化活动实施方案
2014/03/28 职场文书
白酒营销策划方案
2014/08/17 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
股东授权委托书
2014/10/15 职场文书
Python与C++中梯度方向直方图的实现
2022/03/17 Python