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中Date获取时间不正确怎么办
Jun 05 PHP
php.ini中date.timezone设置分析
Jul 29 PHP
浅析php中jsonp的跨域实例
Jun 21 PHP
php加密解密函数authcode的用法详细解析
Oct 28 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
php遍历树的常用方法汇总
Jun 18 PHP
php自动加载方式集合
Apr 04 PHP
PHP那些琐碎的知识点(整理)
May 20 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 PHP
JS操作XML中DTD介绍及使用方法分析
Jul 04 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
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
php调整服务器时间的方法
2015/04/03 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
vue使用Google地图的实现示例代码
2018/12/19 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
Vue响应式原理Observer、Dep、Watcher理解
2019/06/06 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
Python 12306抢火车票脚本
2018/02/07 Python
python获取代理IP的实例分享
2018/05/07 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
医学生实习自荐信
2013/10/01 职场文书
生物技术毕业生自荐信
2013/10/23 职场文书
暑假家长评语大全
2014/04/17 职场文书
团支部建设方案
2014/05/02 职场文书
英语教师求职信
2014/06/16 职场文书
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
CSS3 Tab动画实例之背景切换动态效果
2021/08/23 HTML / CSS
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS
postgresql中如何执行sql文件
2023/05/08 PostgreSQL