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的知识
Nov 17 PHP
PHP函数utf8转gb2312编码
Dec 21 PHP
php实现mysql同步的实现方法
Oct 21 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 PHP
php 使用array函数实现分页
Feb 13 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
Mar 17 PHP
PHP微信公众号自动发送红包API
Jun 01 PHP
浅析Laravel5中队列的配置及使用
Aug 04 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
laravel 查询数据库获取结果实现判断是否为空
Oct 24 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 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中的string类型使用说明
2010/07/27 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
2015/02/12 PHP
PHP中数据类型转换的三种方式
2015/04/02 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
PHP实现防止表单重复提交功能【基于token验证】
2018/05/24 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
jQuery设置与获取HTML,文本和值的简单实例
2014/02/26 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
ionic2懒加载配置详解
2017/09/01 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
JS实现字符串去重及数组去重的方法示例
2018/04/21 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
调试Python程序代码的几种方法总结
2015/04/28 Python
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
Django实现网页分页功能
2019/10/31 Python
Python连接字符串过程详解
2020/01/06 Python
详解python with 上下文管理器
2020/09/02 Python
常用的HTML5列表标签
2017/06/20 HTML / CSS
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
应届毕业生自荐信
2014/05/28 职场文书
促销活动总结怎么写
2014/06/25 职场文书
音乐学专业求职信
2014/07/22 职场文书
会员卡清退活动总结
2014/08/27 职场文书
电影建党伟业观后感
2015/06/01 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
Windows server 2016服务器基本设置
2022/08/14 Servers
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers