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
PHP与SQL注入攻击[一]
Apr 17 PHP
PHPMailer安装方法及简单实例
Nov 25 PHP
php 表单数据的获取代码
Mar 10 PHP
PHP使用feof()函数读文件的方法
Nov 07 PHP
smarty简单入门实例
Nov 28 PHP
php实现简单爬虫的开发
Mar 28 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
Oct 28 PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 PHP
PHP实现限制IP访问及提交次数的方法详解
Jul 17 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
TP - 比RBAC更好的权限认证方式(Auth类认证)
Mar 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 mcrypt可逆加密算法分析
2011/07/19 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
自己写的php中文截取函数mb_strlen和mb_substr
2015/02/09 PHP
使用php+swoole对client数据实时更新(一)
2016/01/07 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
Prototype使用指南之string.js
2007/01/10 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
JS 加入收藏夹的代码(主流浏览器通用)
2013/05/13 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
JavaScript表单验证实例之验证表单项是否为空
2016/01/10 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
微信小程序 toast 详解及实例代码
2016/11/09 Javascript
JS+HTML+CSS实现轮播效果
2017/11/28 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
Python爬取国外天气预报网站的方法
2015/07/10 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
python自动循环定时开关机(非重启)测试
2019/08/26 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
HTML5 Canvas基本线条绘制的实例教程
2016/03/17 HTML / CSS
求职信的正确写法
2014/07/10 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
公司委托书格式范本
2014/09/16 职场文书
2014年业务工作总结
2014/11/17 职场文书
公共场所卫生管理制度
2015/08/05 职场文书
大学生党课心得体会
2016/01/07 职场文书
2016年第二十届“母亲节暨幸福工程救助贫困母亲活动日”活动总结
2016/04/06 职场文书
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏