PHP学习笔记2——设计模式
概念常用的设计模式单例设计模式单例设计模式的要求数据库工具类(./libs/Db.class.php)连接数据库的公共文件(./conn.php)显示学生信息列表(./list.php)
工厂设计模式概念工厂设计模式的要求实例:创建不同形状类的对象
概念
设计模式(Design Pattern):是一套反复被使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
常用的设计模式
单例设计模式:一个类只能创建一个实例对象,不管用什么办法都无法创建第2个对象;工厂设计模式:生产不同类对象的工厂;策略设计模式:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换;观察者设计模式:定义对象间一种一对多的依赖关系使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
单例设计模式
单例设计模式的要求
三私一公:
私有的静态的保存对象的属性私有的构造方法,阻止类外new对象私有的克隆方法,阻止类外clone对象共有的静态的创建对象的方法
单例设计模式的核心代码:
<?php
class Db
{
private static $obj=null;
private function __construct()
{
}
private function __clone(){}
public static function getInstance()
{
if(!self
::$obj instanceof self)
{
self
::$obj=new self();
}
return self
::$obj;
}
}
$db1=Db
::getInstance();
$db2=Db
::getInstance();
var_dump($db1,$db2);
数据库工具类(./libs/Db.class.php)
<?php
class Db
{
private static $obj=null;
private $db_host;
private $db_user;
private $db_pass;
private $db_name;
private $charset;
private $link;
private function __construct($config=array())
{
$this->db_host=$config['db_host'];
$this->db_user=$config['db_user'];
$this->db_pass=$config['db_pass'];
$this->db_name=$config['db_name'];
$this->charset=$config['charset'];
$this->connectDb();
$this->selectDb();
$this->setCharset();
}
private function __clone(){}
public static function getInstance($config=array())
{
if(!self
::$obj instanceof self)
{
self
::$obj=new self($config);
}
return self
::$obj;
}
private function connectDb()
{
if(!$this->link=@
mysqli_connect($this->db_host,$this->db_user,$this->db_pass))
{
echo "连接mysql服务器失败!";
die();
}
}
private function selectDb()
{
if(!mysqli_select_db($this->link,$this->db_name))
{
echo "选择数据库{$this->db_name}失败!";
die();
}
}
private function setCharset()
{
mysqli_set_charset($this->link,$this->charset);
}
public function exec($sql)
{
$sql=strtolower($sql);
if(substr($sql,0,6)=='select')
{
echo "不能执行select语句!";
die();
}
return mysqli_query($this->link,$sql);
}
private function query($sql)
{
$sql=strtolower($sql);
if(substr($sql,0,6)!='select')
{
echo "不能执行非select语句!";
die();
}
return mysqli_query($this->link,$sql);
}
public function fetchOne($sql,$type=3)
{
$result=$this->query($sql);
$types=array(
1=>MYSQLI_NUM,
2=>MYSQLI_BOTH,
3=>MYSQLI_ASSOC
);
return mysqli_fetch_array($result,$types[$type]);
}
public function fetchAll($sql,$type=3)
{
$result=$this->query($sql);
$types=array(
1=>MYSQLI_NUM,
2=>MYSQLI_BOTH,
3=>MYSQLI_ASSOC
);
return mysqli_fetch_all($result,$types[$type]);
}
public function rowCount($sql)
{
$result=$this->query($sql);
return mysqli_num_rows($result);
}
private function __destruct()
{
mysqli_close($this->link);
}
}
连接数据库的公共文件(./conn.php)
<?php
spl_autoload_register(function($className){
$filename="./libs/$className.class.php";
if(file_exists($filename))
require_once($filename);
});
$arr=array(
'db_host' => 'localhost',
'db_user' => 'root',
'db_pass' => '',
'db_name' => 'itcast',
'charset' => 'utf8'
);
$db=Db
::getInstance($arr);
显示学生信息列表(./list.php)
<?php
require_once("./conn.php");
$sql="select * from student";
$arrs=$db->fetchAll($sql);
$records=$db->rowCount($sql);
?>
工厂设计模式
概念
根据传递不同的类名参数,返回不同类的对象工厂模式,就是生产各种的不同类的对象工厂模式改变了在类外使用new关键字创建对象的方式,改变了在工厂类中创建类的对象在类的外部我们无法控制类的行为,但在类内部自己可以控制类的行为。
工厂设计模式的要求
工厂类中的方法,应该是公共的静态的方法;该方法的功能:就是根据传递的不痛痛参数,去创建不通过类的实例。
实例:创建不同形状类的对象
shape.class.php
<?php
Interface Shape
{
public function draw();
}
Circle.class.php
<?php
class Circle implements Shape
{
public function draw()
{
echo "正在绘制圆形!";
}
}
Rectangle.class.php
<?php
class Rectangle implements Shape
{
public function draw()
{
echo "正在绘制矩形!";
}
}
Factory.class.php
<?php
class Factory
{
public static function getInstance($className)
{
switch($className)
{
case "Rectangle":
return new Rectangle;
break;
case "Circle":
return new Circle;
break;
default:
return null;
}
}
}
app.php
<?php
spl_autoload_register(function($className){
$filename="./libs/$className.class.php";
if(file_exists($filename))
require_once($filename);
});
$rectangle=Factory
::getInstance("Rectangle");
$rectangle->draw();
$circle=Factory
::getInstance("Circle");
$circle->draw();