幻灯片 1:
初探PHP设计模式
copyright CSDN 白毛大侠
幻灯片 2:
我们说别人代码写的烂,烂在哪?
反思我们平时是怎么写代码的?
非开发者如何转开发(业务) ?
一.过程与对象
幻灯片 3:
echo “开火”;
echo “煎鱼”;
echo “烧水”
echo “水滚,放鱼”
echo “起锅”
echo “开火”;
echo “煎鱼”;
echo “放调料”
echo “再煎”
echo “起锅”
内容1
面向过程的代码
幻灯片 4:
1
3
2
代码无法重用
代码属于堆砌状态
会被接手的人诅咒
问题
幻灯片 5:
function zhuyu(){
echo “开火”;
echo “煎鱼”;
echo “烧水”
echo “水滚,放鱼”
echo “起锅”}
function jianyu(){
echo “开火”;
echo “煎鱼”;
echo “放调料”
echo “再煎”
echo “起锅”}
zhuyu();
jianyu();
内容1
面向结构化的代码
幻灯片 6:
1
3
2
代码可重用
方便调用
结构清晰
优点
1
3
2
文件做为结构化编程的一个集合单元,那么,文件的数量会越来越多
勉强的解决方案:
目录做为更大的集合
问题
自己都不记得哪里被调用过
Function不易找到
不知是否声明过、写过类似功能的function
function命名易重名,
新代码的修改会破坏原有代码,存在新的bug隐患。
幻灯片 7:
面向对象:考虑维护期的设计方式
我才是主角
觉悟吧!!
幻灯片 8:
Class Student {
public $name;
public $age;
protected $grade;
//constract
public function showInfo() {
echo $this -> name.":".$this -> age;
}
public function xuehao() {
echo "
学号:".($this->age + 10);
}
}
$stu1 = new Student();
$stu1 -> name = "zhangsan";
$stu1 -> age = "24";
$stu1 -> showInfo();
$stu1 -> xuehao();
?>
幻灯片 9:
PHP面向对象三大特征封装、多态、继承
幻灯片 10:
封装
封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行操作。
通俗来说:
封装是php面向对象的其中一个特性,将多个可重复使用的函数封装到一个类里面。在使用时直接实例化该类的某一个方法,获得需要的数据
如果是私有的方法和属性值,外部无法访问,具有一定的保护作用。
幻灯片 11:
继承
所谓继承,就是一个子类通过extends 父类 把父类的一些(public / protected)属性和(public / protected)方法继承下来。不能继承私有的
幻灯片 12:
//简单的继承例子
//父类
Class Student {
public $name;
protected $age;
protected $grade;
/*function __construct() {
echo 1234;
$this->name = 5555;
}*/
public function showInfo() {
echo $this -> name."
".$this -> age;
}
}
/**
* 小学生
*/
class Pupil extends Student
{
/*function __construct() {
parent::__construct();
var_dump($this->name);
echo 'xiaoxuesheng';
$this->name = 'xiaoxuesheng';
}*/
public function test() {
echo "
小学生在考试。。。";
}
}
/**
* 大学生
*/
class Graduate extends Student
{
public function test() {
echo "
大学生在考试。。。";
}
}
$stu1 = new Pupil();
$stu1 -> name = "lizzy";
$stu1 -> test();
$stu1 -> showInfo();
$stu2 = new Graduate();
$stu2 -> name = "zxm";
$stu2 -> test();
$stu2 -> showInfo();
?>
幻灯片 13:
//(1)protected属性和方法受保护,在子类不能直接调用,要在子类中定义方法访问。
Class ParentClass {
public $name = 'lizzy';
protected $age = 24;
private $sex = "女";
public function test1() {
echo "
展示public方法";
}
protected function test2() {
echo "
展示protected方法";
}
private function test3() {
echo "
展示private方法";
}
}
Class SubClass extends ParentClass {
function show() {
echo "age=".$this->age;
// echo "sex=".$this->sex;//是不能继承下来的
$this -> test2();
// $this -> test3(); //间接访问都不行
}
}
$sub1 = new SubClass();
$name=$sub1 -> name;
var_dump($name);
$sub1 -> show(); //show直接访问,test2可以间接访问
$sub1 -> test1();//可以直接访问
$name=$sub1 -> test2;//不能直接访问
$name=$sub1 -> test3;//不能直接访问
幻灯片 14:
(1)protected属性和方法受保护,在子类不能直接调用,要在子类中定义方法访问。
(2)如果希望子类调用父类的构造方法,或者其他方法(public / protected),可以使用类名::方法名; 或者parent::方法名;
(3)当一个子类的方法和父类方法(protected/public)完全一致时,我们称之为方法的覆盖(重写)。
幻灯片 15:
多态
一个类,被多个子类继承,如果这个类的某个方法,在多个子类中,表现出不同的功能,我们称这种行为为多态。
(同一个类的不同子类表现出的不同行态)
多态的实现必须要满足三个条件:一是子类继承父类,二是子类重写父类的方法,三是父类引用指向子类对象
幻灯片 16:
//当一个父类知道所有的子类都有一个方法
//但是父类不能确定该方法究竟如何写,可以让子类去覆盖这个方法。
Class Animal {
function cry() {
echo “发声叫";
}
} //重写
Class Dog extends Animal {
function cry() { echo "小狗汪汪叫"; }
} //重写
Class Pig extends Animal {
function cry() { echo "小猪哼哼叫"; }
}
$dog = new Dog();
$dog -> cry();
echo "
";
$pig = new Pig();
$pig -> cry();
?>
幻灯片 17:
设计模式不是拳打脚踢
它是一套降龙十八掌
幻灯片 18:
幻灯片 19:
幻灯片 20:
Singleton(单例模式):单例模式是最常见的模式之一,在Web应用的开发中,常常用于允许在运行时为某个特定的类创建仅有一个可访问的实例。
Factory(工厂模式):工厂模式是另一种非常常用的模式,正如其名字所示:确实是对象实例的生产工厂。某些意义上,工厂模式提供了通用的方法有助于我们去获取对象,而不需要关心其具体的内在的实现。
单例模式
工厂模式
幻灯片 21:
class Single {
private $name;//声明一个私有的实例变量
private function __construct(){//声明私有构造方法为了防止外部代码使用new来创建对象。
}
static public $instance;//声明一个静态变量(保存在类中唯一的一个实例)
static public function getinstance(){//声明一个getinstance()静态方法,用于检测是否有实例对象
if(!self::$instance) self::$instance = new self();
return self::$instance;
}
public function setname($n){
$this->name = $n;
}
public function getname(){
return $this->name;
}
}
$oa = Single::getinstance();
var_dump($oa);
$oa->setname('hellow');
$ob = Single::getinstance();
echo $oa->getname();//hellow
echo $ob->getname();//hellow
单例模式
幻灯片 22:
工厂模式
幻灯片 23:
工厂模式
幻灯片 24:
class CommsManager {
const BLOGGS = 1;
const MEGA = 2;
private $mode = 1;
public function __construct( $mode )
{
$this->mode = $mode;
}
function getApptEncoder()
{
switch($this->mode) {
case (self::MEGA):
return new MegaApptEncoder();
default:
return new BloggsApptEncoder();
}
}
}
$comms = new CommsManager(CommsManager::MEGA);
$appEncoder = $comms->getApptEncoder();
Print $apptEncoder->encode();
工厂模式
幻灯片 25:
框架是有灵魂的,看你是否能心意相通
幻灯片 26:
工厂模式
幻灯片 27:
谢谢
观看