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入门源程序
Oct 09 PHP
NT IIS下用ODBC连接数据库
Oct 09 PHP
PHP与SQL注入攻击[一]
Apr 17 PHP
php图片上传存储源码并且可以预览
Aug 26 PHP
如何用php获取文件名后缀
Jun 09 PHP
wordpress自定义url参数实现路由功能的代码示例
Nov 28 PHP
CI框架中zip类应用示例
Jun 17 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
Aug 23 PHP
thinkPHP内置字符串截取函数用法详解
Nov 15 PHP
几行代码轻松实现PHP文件打包下载zip
Mar 01 PHP
浅谈php://filter的妙用
Mar 05 PHP
phpstudy隐藏index.php的方法
Sep 21 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的库,结果发现很多东西
2006/12/31 PHP
精美漂亮的php分页类代码
2013/04/02 PHP
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
JavaScript 学习笔记(十一)
2010/01/19 Javascript
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
javascript表单正则应用
2017/02/04 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
微信小程序之分享页面如何返回首页的示例
2018/03/28 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
numpy的文件存储.npy .npz 文件详解
2018/07/09 Python
Python数据类型之Dict字典实例详解
2019/05/07 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
实习自我评价怎么写
2013/12/02 职场文书
商场租赁意向书
2014/07/30 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python
MySQL学习必备条件查询数据
2022/03/25 MySQL
sql注入报错之注入原理实例解析
2022/06/10 MySQL