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 相关文章推荐
PR值查询 | PageRank 查询
Dec 20 PHP
解析php防止form重复提交的方法
Jul 01 PHP
PHP连接sql server 2005环境配置及问题解决
Aug 08 PHP
php中文字符串截取方法实例总结
Sep 30 PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 PHP
PHP中的traits简单使用实例
May 13 PHP
PHP实现生成带背景的图形验证码功能
Oct 03 PHP
PHP脚本自动识别验证码查询汽车违章
Dec 20 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
May 26 PHP
php的常量和变量实例详解
Jun 27 PHP
laravel添加前台跳转成功页面示例
Oct 22 PHP
通过PHP实现获取访问用户IP
May 09 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 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
JS去除右边逗号的简单方法
2013/07/03 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
使用AJAX实现Web页面进度条的实例分享
2016/05/06 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
2016/11/09 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
JS实现非首屏图片延迟加载的示例
2018/01/06 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
2018/02/08 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
送餐员岗位职责范本
2014/02/21 职场文书
Golang的继承模拟实例
2021/06/30 Golang
python读取mat文件生成h5文件的实现
2022/07/15 Python
ECharts transform数据转换和dataZoom在项目中使用
2022/12/24 Javascript