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下网站防IP攻击代码,超级实用
Oct 24 PHP
PHP安全的URL字符串base64编码和解码
Jun 19 PHP
PHP实现从远程下载文件的方法
Mar 12 PHP
php猴子选大王问题解决方法
May 12 PHP
PHP文件缓存smarty模板应用实例分析
Feb 26 PHP
php操纵mysqli数据库的实现方法
Sep 18 PHP
Laravel使用支付宝进行支付的示例代码
Aug 16 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 PHP
浅谈laravel aliases别名的原理
Oct 24 PHP
Laravel 集成微信用户登录和绑定的实现
Dec 27 PHP
PHP中类与对象功能、用法实例解读
Mar 27 PHP
PHP数组array类常见操作示例
May 15 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 将字符串按大写字母分隔成字符串数组
2010/04/30 PHP
PHP实现的登录,注册及密码修改功能分析
2016/11/25 PHP
js类中的公有变量和私有变量
2008/07/24 Javascript
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
利用Vue-draggable组件实现Vue项目中表格内容的拖拽排序
2019/06/07 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
跟老齐学Python之for循环语句
2014/10/02 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python selenium如何设置等待时间
2016/09/15 Python
python字符串str和字节数组相互转化方法
2017/03/18 Python
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
Python实现EM算法实例代码
2020/10/04 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
家得宝官网:The Home Depot(全球最大的家居装饰专业零售商)
2018/12/17 全球购物
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
超市开学活动方案
2014/03/01 职场文书
马智宇结婚主持词
2014/04/01 职场文书
处级干部考察材料
2014/12/24 职场文书
中小企业员工手册范本
2015/05/14 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
预备党员入党感想
2015/08/10 职场文书
2016国培学习心得体会
2016/01/08 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
vue自定义右键菜单之全局实现
2022/04/09 Vue.js