php 设计模式 总结 上
admin
2023-06-26 06:22:31
0次

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 数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据的操作





相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...