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 相关文章推荐
使用 eAccelerator加速PHP代码的目的
Mar 16 PHP
THINKPHP+JS实现缩放图片式截图的实现
Mar 07 PHP
PHP的SQL注入实现(测试代码安全不错)
Feb 27 PHP
php中关于普通表单多文件上传的处理方法
Mar 25 PHP
PHP与SQL注入攻击防范小技巧
Sep 16 PHP
php curl常见错误:SSL错误、bool(false)
Dec 28 PHP
php制作中间带自己定义图片二维码的方法
Jan 27 PHP
浅谈php命令行用法
Feb 04 PHP
php检测图片主要颜色的方法
Jul 01 PHP
微信公众平台开发教程①获取用户Openid及个人信息图文详解
Apr 10 PHP
PHP使用ActiveMQ实现消息队列的方法详解
May 31 PHP
PHP7数组的底层实现示例
Aug 25 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+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
PHP 读取文件的正确方法
2009/04/29 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
JavaScript获取XML数据附示例截图
2014/03/05 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
React native ListView 增加顶部下拉刷新和底下点击刷新示例
2018/04/27 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
python使用pil库实现图片合成实例代码
2018/01/20 Python
使用Python AIML搭建聊天机器人的方法示例
2018/07/09 Python
便捷提取python导入包的属性方法
2018/10/15 Python
python实现广度优先搜索过程解析
2019/10/19 Python
python+Django实现防止SQL注入的办法
2019/10/31 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
python2和python3哪个使用率高
2020/06/23 Python
全方位了解CSS3的Regions扩展
2015/08/07 HTML / CSS
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
LINUX下线程,GDI类的解释
2016/12/14 面试题
在校生党员自我评价
2013/09/25 职场文书
半年思想汇报
2013/12/30 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
代理词怎么写
2015/05/25 职场文书
同事离别感言
2015/08/04 职场文书
大学体育课感想
2015/08/10 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书