php 设计模式 总结 上
1 编程选择等宽字体
2 source code pro 字体
3 运行环境搭建,推荐 easyphp
4 关于命名空间:
面向对象的高级特性
介绍、使用:
namespace test1;
下面的所有代码都属于这个命名空间里面的。
调用:test1\funciton_name(); 即可。
5 类自动载入特性
function __autoload($class); // 以前是这么干的。
{
require __DIR__.'/'.$class.'.php';
}
// 后来被废纸了, 5.3以后用 spl_autoload_register('autoload1');
这样就不冲突了,防止不同框架之间的冲突。自己随便定义自动载入函数。
6 基础框架:
psr-0规范
1 命名空间必须与绝对路径一致
2 类名首字母大写
3 除了入口文件外的其它.php文件只有一个类,不能有可执行代码
开发符合psr-0规范的基础框架
1 全部使用命名空间
2 所有php文件必须自动载入,不能有include/require
3 单一入口
文件:
index.php
App 文件夹
imooc 文件夹
类名 文件名 命名空间 必须一致
注册 自动载入 类;include 包含进来。
7 数据结构
spl 数据结构 4种常用的数据结构
栈
$stack = new splstack(); 栈定义
$stack->push('data1');// 入栈
echo $stack->pop();//出栈
队列
$queue = new splQueue();
$queue->enqueue('data1');
$queue->enqueue('data2');
echo $queue->dequeue();
堆
$heap = new splMinHeap();//最小堆
$heap->insert('data1');//插入
echo $heap->extract();//提取
固定尺寸数组
$array = new splFixedArray(10);
$array[0] = 123;
$array[1] = 234;
var_dump($array);
8 链式操作
$db->where()->limit()->order();
class Database{
function where(){}
function order(){}
function limit(){}
}
传统:
$db->where();
$db->limit();
$db->order();
链式操作的核心就是:每个方法后,return $this;
class Database{
function where(){return $this;}
function order(){return $this;}
function limit(){return $this;}
}
9 魔术方法的使用
1 __get/__set 对象属性接管
2 __call/__callStatic 方法/静态方法 调用
3 __toString // 转换字符串
4 __invoke // 当成函数执行
对于对象不存在的属性的时候自动执行
class Object{
function __set($key,$value){
$this->array[$key] = $value;
}
function __get($key){
return $this->array($key);
}
}
对于对象不存在的方法的时候自动执行
class Object{
function __call($func,$param){
return 'magic function \n';
}
// 类的静态方法
static function __callStatic($func,$param){
return 'magic static function \n';
}
// echo $obj; 把类当作字符串用
function __toString(){
return __CLASS__;
}
//echo $obj($param); 把类当函数用
function __invoke($param){
return 'invoke';
}
}
10 基础设计模式
3种基本设计模式
工厂模式、单立模式、注册模式
工厂方法或类生成对象,而不是在代码中直接new
单例模式:使某个类的对象仅允许创建一个
注册模式:全局共享和交换对象。
工厂模式:工厂方法替换new 操作
class Factory{
static function createDatebase(){
$db = new Database();
return $db;
}
}
$db = IMooc\Factory::createDatabase();
方便统一修改变化;
单列模式: 防止资源浪费,一次创建
class Database
{
private $db;
private function __construct() //创建私有
{
}
static function getInstance()
{
if(self::$db){
return self::$db;
}else{
self::$db = new self();
return self::$db;
}
}
}
注册模式:
class Register{
protected static $objects;
function set($alias,$object){
self::$objects[$alias] = $object;
}
function get($name){
return self::$objects[$name];
}
function _unset($alias){
unset(self::$objects[$alias]);
}
}
用法:$db = Register::get('db1');
适配器模式:
1 适配器模式,可以将截然不同的函数接口封装成统一的API
2 实际应用举例,php的数据库操作有mysql,mysqli,pdo3种模式,可以统一成益智的接口
class mysql {}
class mysqli {}
class pdo{}
namespace IMooc;
interface IDatabase
{
function connet($host,$user,$passwd,$dbname);
function query($sql);
function close();
}
class Datebase{
}
mysql.php
namespace IMooc;
use IMooc\IDatabase;
class MySQL [implements] IDatabase{ [implements] 貌似需要替换
protected $conn;
function connect($host,$user,$passwd,$dbname){
$conn = mysql_connect($host,$user,$passwd);
mysql_select_db($dbname);
$this->conn = $conn;
}
function query($sql){
$res = mysql_query($sql);
return $res;
}
function close(){
}
}
// 使用
$db = new IMooc\Databes\MySQL();
$db->connect('127.0.0.1','root','passwd','dbname');
$db->query($sql);
1首先约定接口,
2实现接口的所有方法
策略模式
1 将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式
2 实际应用举例,假如一个电商网站系统,针对男性女性显示不同。
增加策略即可:
实现和使用
接口文件
UserStrategey.php
namespace IMooc;
interface UserStrategy{
function showAd();
function showCategory();
}
策略实现文件
femalUserStrategy.php
namespace IMooc;
class FemalUserStrategy implemets UserStragey{
function showAd(){
echo '男性广告';
}
function showCategory(){
echo '男人';
}
}
// 女性同上
// 使用文件 index.php
class Page{
protected $strategy;
function index(){
if(isset($_GET['female'])){
// 男性逻辑
}
// 传统如上
// 策略模式如下
echo "AD:";
$this->strategy->showAd();
}
function setStragegy(\IMooc\UserStrategy $strategy){
$this->strategy = $strategy;
}
}
$page = new Page;
if(isset($_GET['female'])){
$strategy = new \IMooc\FemalUserStrategy();
}else{
$strategy = new \IMooc\MaleUserStrategy();
}
$page->setStrategy($strategy);
$page->index();
策略模式的控制反转、依赖导致
面向对象的解耦。很重要。
数据对象映射模式
1 数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据的操作