概述
谢谢大家的收藏与赞,这是对我最大的鼓励。
这一系列文章主要是一些PHP常用的类操作,回顾一下面向对象,我一直致力于小白文章的撰写,因为我也是小白,相信有人需要,希望读者能够喜欢。
说明
- 关于PHP语言实现各种操作类,网上都能够找得到,但是质量参差不齐,有的代码不好懂,有时候看的眼花缭乱,所以我在这里统一作了一个整理(注意:是整理,每一种操作类,我至少会参考三份优秀代码,然后自己跑出来,而不是CV)
- 我会尽量遵守PSR规范,会有很详细易懂的注释
- 对于其中涉及到的相关知识点,比如设计模式,类型检测、浏览器架构、通信数据我也会简单讲讲,并留下相关链接,希望读者能够细嚼慢咽
阅读准备
内容涉及面向对象、数据库、文件操作、购物车、分页、图像处理、JSON数据接口,你可能需要有一点知识基础,当然,这些内容都是独立的,可以选择性的参看。
Source Code
<?php
/**
* TODO:数据库模型类
* Author:entner
* time: 2017-5-6
* version:1.0
*/
Class DB{
protected $HOST = '127.0.0.1'; //主机地址
protected $DATABASE;
protected $USER ="root"; //数据库用户名
protected $ROOT ="root"; //数据库用户密码
private static $resource; //数据库连接资源句柄
private static $instance; //静态变量保存类的唯一实例
/**
* 构造函数和克隆函数必须声明为私有的,防止外部获取
*/
private function __construct(){
echo "hello";
}
/**
* TODO:获取操作类实例
* 单例模式:只给一个入口
* static : 让连接静态化,不需要重复声明
*/
public static function getInstance(){
if(!self::$instance instanceof self){
self::$instance = new self();
}
return self::$instance;
}
/**
* TODO:数据库连接
* @pagram $dbname string 数据库名称
*/
public function connect($dbname = "mail"){
$this->DATABASE = $dbname;
/* 判断数据库是否连接 */
if(!self::$resource){
self::$resource = mysqli_connect($this->HOST,$this->USER,$this->ROOT,$this->DATABASE);
/* 如果数据库连接失败 */
if(!self::$resource){
throw new Execption('mysql connect error'.mysqli_connect_error());
}
/* 设置编码 */
mysqli_query(self::$resource,"set names UTF8");
}
return self::$resource;
}
}
/**********Coding 1*********************
$res = DB::getInstance()->connect("base");
print_r($res);
die;
********************************/
/**********Coding 2*********************
$res = new DB();
$res::getInstance()->connect();
因为构造函数的私有性,这一句会产生fatal error 错误
********************************/
/**********Coding 3*********************
$a = DB::getInstance();
$a->connect();
$b = DB::getInstance();
$b->connect();
echo "<pre>";
print_r($a);
print_r($b);
只会执行一次构造函数,说明$a $b是类的同一个实例
********************************/
解析
如果不看构造函数和getInstance方法,其实可以看的出来,实现数据库操作类很简单,只需要把数据库连接函数的参数当作类成员变量,然后调用就行了,但是这里用了一个简单的设计模式——单例模式,总之加上它,代码会更便捷、健壮,下面简单讲讲。
为什么使用单例模式?
其实从技术上考虑主要是考虑节省内存资源(因为访问数据库的话我们实例一次就够了,不需要重复实例[2019.5.28 update]),提升系统性能,但实际能够感受到的就是更方便,而且逼格高一些,所以用它。
什么是单例模式?
举个例子,就是大楼只有一个入口,方便控制,用面向对象来说,就是一个类只有一个实例,方便管理。
代码部分是怎么实现单例模式的?
- 首先声明一个私有构造函数,这样就不能在外面使用 new 来实例化多个对象了,你可以用coding 2的代码试一试,会报错
- 构造一个公共入口来获取类的实例,总的有实例可用撒,注意这个self指的是当前类,instanceof是检查当前变量是否为类的实例
如何检查单例效果?
你可以用coding 3的代码查看输出结果,然后你会发现构造函数只执行了一次,说明,第一次实例化对象之后,后面的变量对对象的引用是一致的,说明实例实际上只有一个。
为什么getInstance方法是静态的呢?
函数也是变量,静态化变量,不管引用多少次,都不会重复生成,比较节省空间,这里并不考虑多线程的问题。
参考链接
PHP 单例模式解析和实战
PHP 设计模式 单例模式
单例模式5种实现方式
语言中,静态方法和非静态方法你懂多少?
结语
有没懂的或者又觉得不对的,欢迎大家留言。
最后
我会把源代码放在GitHub主页上,别担心,是中文,有需要的可以访问下载.