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 相关文章推荐
自动分页的不完整解决方案
Jan 12 PHP
生成卡号php代码
Apr 09 PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
PHP执行批量mysql语句的解决方法
May 02 PHP
PHP 文件编程综合案例-文件上传的实现
Jul 03 PHP
php获取操作系统语言代码
Nov 04 PHP
PHP捕获Fatal error错误的方法
Jun 11 PHP
destoon数据库表说明汇总
Jul 15 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
Apr 15 PHP
Yii2中cookie用法示例分析
Jul 18 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题
Aug 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
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
jQuery ajax的功能实现方法详解
2017/01/06 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
tensorflow实现简单的卷积网络
2018/05/24 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
python标记语句块使用方法总结
2019/08/05 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
flask 实现token机制的示例代码
2019/11/07 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
英国领先的男士美容护发用品公司:Mankind
2016/08/31 全球购物
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
工厂门卫岗位职责
2013/11/25 职场文书
幼儿园教师培训方案
2014/02/04 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
安徽导游词
2015/02/12 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python