百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

PHP开发自己的框架必备知识点(php框架基础教程)

ccwgpt 2024-09-14 00:14 44 浏览 0 评论

一、PHP常用的四种数据结构

简介:spl是php的一个标准库。

官方文档:http://php.net/manual/zh/book.spl.php


  1. <?php
  2. //spl(php标准库)数据结构
  3. /**
  4. * 栈(先进后出)
  5. */
  6. $stack = new SplStack();
  7. $stack->push('data1');//入栈(先进后出)
  8. $stack->push('data2');//入栈
  9. $stack->push('data3');//入栈
  10. echo $stack->pop();//出栈
  11. echo $stack->pop();//出栈
  12. echo $stack->pop();//出栈
  13. /**
  14. *队列(先进先出)
  15. */
  16. $queue = new SplQueue();
  17. $queue->enqueue('data4');//入队列
  18. $queue->enqueue('data5');//入队列
  19. $queue->enqueue('data6');//入队列
  20. echo $queue->dequeue();//出队列
  21. echo $queue->dequeue();//出队列
  22. echo $queue->dequeue();//出队列
  23. echo $queue->dequeue();//出队列
  24. /**
  25. * 堆
  26. */
  27. $heap = new SplMinHeap();
  28. $heap->insert('data8');//入堆
  29. $heap->insert('data9');//入堆
  30. $heap->insert('data10');//入堆
  31. echo $heap->extract();//从堆中提取数据
  32. echo $heap->extract();//从堆中提取数据
  33. echo $heap->extract();//从堆中提取数据
  34. /**
  35. * 固定数组(不论使不使用,都会分配相应的内存空间)
  36. */
  37. $array = new SplFixedArray(15);
  38. $array['0'] = 54;
  39. $array['6'] = 69;
  40. $array['10'] = 32;
  41. var_dump($array);

二、PHP链式操作的实现(原理)

1、入口文件 index.php


  1. <?php
  2. /**
  3. * 框架入口文件
  4. */
  5. define('BASEDIR',__DIR__);//项目根目录
  6. include BASEDIR.'/Extend/Loader.php';//引入项目自动加载类文件
  7. spl_autoload_register('\\Extend\\Loader::autoload');//执行自动加载函数,完成类的自动加载
  8. $db = new \Extend\Database();
  9. $db->where('uid < 100000')->->order('uid desc')->limit(100);

2、自动加载类 Loader.php


  1. <?php
  2. namespace Extend;
  3. /**
  4. * 实现框架的自动加载
  5. */
  6. class Loader
  7. {
  8. /**
  9. * 实现文件的自动载入
  10. */
  11. static function autoload($class)
  12. {
  13. require BASEDIR.'/'.str_replace('\\','/',$class).'.php';
  14. }
  15. }

3、数据库类Database.php

注:只是原理,并没有对方法进行具体的封装,具体的封装还是看个人喜好去定链式查询的风格。


  1. <?php
  2. namespace Extend;
  3. class Database
  4. {
  5. /**
  6. * 指定查询条件
  7. * @param $where
  8. */
  9. function where($where)
  10. {
  11. return $this;
  12. }
  13. /**
  14. * 指定排序条件
  15. */
  16. function order($order)
  17. {
  18. return $this;
  19. }
  20. /**
  21. * 指定查询的限制条数
  22. * @param $limit
  23. */
  24. function limit($limit)
  25. {
  26. return $this;
  27. }
  28. }

其实就是对传过来的条件进行重新的底层封装,然后再把当前对象返回,使得可以不断的链式查询。

三、PHP魔术方法的使用

在php设计模式中,会涉及到很多魔术方法的使用,这里也对经常会用到的魔术方法进行简单总结。

1、框架入口文件 index.php


  1. <?php
  2. /**
  3. * 框架入口文件
  4. */
  5. define('BASEDIR',__DIR__);//项目根目录
  6. include BASEDIR.'/Extend/Loader.php';//引入项目自动加载类文件
  7. spl_autoload_register('\\Extend\\Loader::autoload');//执行自动加载函数,完成类的自动加载
  8. /**
  9. * 魔术方法的使用
  10. */
  11. # 实例化Object类
  12. $obj = new \Extend\Object();//当前文件不存在这个类,就会自动执行自动加载函数去包含相应的类文件(即 Extend/Object.php)
  13. # __set 和 __get 对不存在的属性进行接管
  14. $obj->title = 'xiaobudiu'; //当对一个不存在的类属性赋值时,会自动调用类中定义的__set()
  15. echo $obj->title; //当调用一个不存在的类属性时,会自动调用类中定义的__get()
  16. # __call 和 __callStatic 对不存在或者权限不够的类方法进行接管
  17. $obj->getUserInfo('1000068'); //当调用一个不存在的类方法时,会调用__call(),并自动将当前方法名和参数传到__call方法中
  18. \Extend\Object::getOpenId('1000068'); //当调用一个不存在的类静态方法时,会调用__callStatic(),并自动将当前方法名和参数传递到__callStatic方法中
  19. # echo或print对象时,由__toString 接管
  20. echo $obj; //当echo或print一个对象时,会自动调用类中定义的__toString方法
  21. # 在php中,如果我们把一个对象当成函数用,则由__invoke()接管
  22. $obj('xiaobudiu');//当我们将一个对象当成函数用的时候,会自动调用当前类中定义的__invoke()方法

2、 Extend/Object.php


  1. <?php
  2. namespace Extend;
  3. /**
  4. * 要求类名必须和文件名保持一致,即类名是Object,则所在文件名为Object.php
  5. * Class Object
  6. * @package Extend
  7. */
  8. class Object
  9. {
  10. protected $array = array();
  11. /**
  12. * 在代码要给未定义的属性赋值时调用,或在类外部修改被private修饰的类属性时被调用
  13. */
  14. function __set($name, $value)
  15. {
  16. echo "this is __set func";
  17. }
  18. /**
  19. * 当在类外部访问被private或proteced修饰的属性或访问一个类中原本不存在的属性时被调用
  20. * @param $name
  21. */
  22. function __get($name)
  23. {
  24. echo "this is __get func";
  25. }
  26. /**
  27. * 当试图调用不存在的方法或权限不足时会触发__call()
  28. * @param $name 调用不存在的类方法时那个不存在的类方法的方法名
  29. * @param $arguments 调用不存在的类方法时传递的参数
  30. */
  31. function __call($name, $arguments)
  32. {
  33. var_dump($name,$arguments);
  34. }
  35. /**
  36. * 当试图调用不存在的静态方法或权限不足时会触发__callStatic()
  37. * @param $name 调用不存在的静态方法时那个不存在的方法的方法名
  38. * @param $arguments 调用不存在的静态方法时传递的参数
  39. */
  40. function __callStatic($name,$arguments)
  41. {
  42. var_dump($name,$arguments);
  43. }
  44. /**
  45. * 当使用echo或print打印对象时会调用__toString()方法将对象转化为字符串
  46. */
  47. function __toString()
  48. {
  49. echo "this is __toString func";
  50. }
  51. /**
  52. * 对象本身不能直接当函数用,如果被当做函数用,会直接回调__invoke方法
  53. * @param $param
  54. */
  55. function __invoke($param)
  56. {
  57. echo $param."<br>this is __invoke func";
  58. }
  59. }

四、三种基础设计模式

1、工厂模式

通过传入参数的不同,来实例化不同的类。

index.php


  1. <?php
  2. /**
  3. * 框架入口文件
  4. */
  5. define('BASEDIR',__DIR__);//项目根目录
  6. include BASEDIR.'/Extend/Loader.php';//引入项目自动加载类文件
  7. spl_autoload_register('\\Extend\\Loader::autoload');//执行自动加载函数,完成类的自动加载
  8. //构造实例化缓存类时传入的参数
  9. $config = array(
  10. 'host' => '127.0.0.1',
  11. 'pass' => 'myRedis&&&'
  12. );
  13. //工厂模式创建cache对象
  14. $cache = Extend\CacheFactory::getCacheObj('redis',$config);
  15. var_dump($cache);

Extend/CacheFactory.php


  1. <?php
  2. namespace Extend;
  3. class CacheFactory
  4. {
  5. const FILE = 1;
  6. const MEMCACHE = 2;
  7. const REDIS = 3;
  8. static $instance;//定义静态属性,用于存储对象
  9. /**
  10. * 工厂类创建缓存对象
  11. * @param $type 指定缓存类型
  12. * @param array $options 传入缓存参数
  13. * @return FileCache|Memcache|RedisCache
  14. */
  15. static function getCacheObj($type, array $options)
  16. {
  17. switch ($type) {
  18. case 'file':
  19. case self::FILE:
  20. self::$instance = new FileCache($options);
  21. break;
  22. case 'memcache':
  23. case self::MEMCACHE:
  24. self::$instance = new Memcache($options);
  25. break;
  26. case 'redis':
  27. case self::REDIS:
  28. self::$instance = new RedisCache($options);
  29. break;
  30. default:
  31. self::$instance = new FileCache($options);
  32. break;
  33. }
  34. return self::$instance;
  35. }
  36. }

2、单例模式

保证一个类只实例化一个类对象,进而减少系统开销和资源的浪费

index.php


  1. <?php
  2. /**
  3. * 框架入口文件
  4. */
  5. define('BASEDIR',__DIR__);//项目根目录
  6. include BASEDIR.'/Extend/Loader.php';//引入项目自动加载类文件
  7. spl_autoload_register('\\Extend\\Loader::autoload');//执行自动加载函数,完成类的自动加载
  8. //单例模式创建对象
  9. $obj = Extend\SingleObject::getInstance();
  10. $obj2 = Extend\SingleObject::getInstance();
  11. var_dump($obj,$obj2);//从结果可以看出,两个实例化的对象其实是一个对象

Extend/SingleObject.php


  1. <?php
  2. namespace Extend;
  3. /**
  4. * 单例模式创建唯一类对象
  5. * Class SingleObject
  6. * @package Extend
  7. */
  8. class SingleObject
  9. {
  10. //私有的静态属性,用于存储类对象
  11. private static $instance = null;
  12. //私有的构造方法,保证不允许在类外 new
  13. private function __construct(){}
  14. //私有的克隆方法, 确保不允许通过在类外 clone 来创建新对象
  15. private function __clone(){}
  16. //公有的静态方法,用来实例化唯一当前类对象
  17. public static function getInstance()
  18. {
  19. if(is_null(self::$instance)){
  20. self::$instance = new self;
  21. }
  22. return self::$instance;
  23. }
  24. }

3、注册树模式

将我们用到的对象注册到注册树上,然后在之后要用到这个对象的时候,直接从注册树上取下来就好。(就和我们用全局变量一样方便)

Extend/RegisterTree,php


  1. <?php
  2. namespace Extend;
  3. /**
  4. * 注册树模式
  5. * Class RegisterTree
  6. * @package Extend
  7. */
  8. class RegisterTree
  9. {
  10. static protected $objects;//静态类属性,用于储存注册到注册树上的对象
  11. /**
  12. * 将对象注册到注册树上
  13. * @param $alias 对象的别名
  14. * @param $object 对象
  15. */
  16. static function setObject($alias,$object)
  17. {
  18. self::$objects[$alias] = $object;
  19. }
  20. /**
  21. * 从注册树上取出给定别名相应的对象
  22. * @param $alias 将对象插入到注册树上时写的别名
  23. * @return mixed 对象
  24. */
  25. static protected function getObject($alias)
  26. {
  27. return self::$objects[$alias];
  28. }
  29. /**
  30. * 将对象从注册树上删除
  31. * @param $alias 将对象插入到注册树上时写的别名
  32. */
  33. public function unsetObject($alias)
  34. {
  35. unset(self::$objects[$alias]);
  36. }
  37. }

关于注册树模式,这里推荐一篇文章 ,可以方便理解。 https://www.cnblogs.com/DeanChopper/p/4767181.html

五、其他常见的8种PHP设计模式

1、适配器模式

2、策略模式

3、数据对象映射模式

4、观察者模式

5、原型模式

6、装饰器模式

7、迭代器模式

8、代理模式

相关推荐

团队管理“布阵术”:3招让你的团队战斗力爆表!

为何古代军队能够以一当十?为何现代企业有的团队高效似“特种部队”,有的却松散若“游击队”?**答案正隐匿于“布阵术”之中!**今时今日,让我们从古代兵法里萃取3个核心要义,助您塑造一支战斗力爆棚的...

知情人士回应字节大模型团队架构调整

【知情人士回应字节大模型团队架构调整】财联社2月21日电,针对原谷歌DeepMind副总裁吴永辉加入字节跳动后引发的团队调整问题,知情人士回应称:吴永辉博士主要负责AI基础研究探索工作,偏基础研究;A...

豆包大模型团队开源RLHF框架,训练吞吐量最高提升20倍

强化学习(RL)对大模型复杂推理能力提升有关键作用,但其复杂的计算流程对训练和部署也带来了巨大挑战。近日,字节跳动豆包大模型团队与香港大学联合提出HybridFlow。这是一个灵活高效的RL/RL...

创业团队如何设计股权架构及分配(创业团队如何设计股权架构及分配方案)

创业团队的股权架构设计,决定了公司在随后发展中呈现出的股权布局。如果最初的股权架构就存在先天不足,公司就很难顺利、稳定地成长起来。因此,创业之初,对股权设计应慎之又慎,避免留下巨大隐患和风险。两个人如...

消息称吴永辉入职后引发字节大模型团队架构大调整

2月21日,有消息称前谷歌大佬吴永辉加入字节跳动,并担任大模型团队Seed基础研究负责人后,引发了字节跳动大模型团队架构大调整。多名原本向朱文佳汇报的算法和技术负责人开始转向吴永辉汇报。简单来说,就是...

31页组织效能提升模型,经营管理团队搭建框架与权责定位

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!31页组织效能提升模型如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...

异形柱结构(异形柱结构技术规程)

下列关于混凝土异形柱结构设计的说法,其中何项正确?(A)混凝土异形柱框架结构可用于所有非抗震和抗震设防地区的一般居住建筑。(B)抗震设防烈度为6度时,对标准设防类(丙类)采用异形柱结构的建筑可不进行地...

职场干货:金字塔原理(金字塔原理实战篇)

金字塔原理的适用范围:金字塔原理适用于所有需要构建清晰逻辑框架的文章。第一篇:表达的逻辑。如何利用金字塔原理构建基本的金字塔结构受众(包括读者、听众、观众或学员)最容易理解的顺序:先了解主要的、抽象的...

底部剪力法(底部剪力法的基本原理)

某四层钢筋混凝土框架结构,计算简图如图1所示。抗震设防类别为丙类,抗震设防烈度为8度(0.2g),Ⅱ类场地,设计地震分组为第一组,第一自振周期T1=0.55s。一至四层的楼层侧向刚度依次为:K1=1...

结构等效重力荷载代表值(等效重力荷载系数)

某五层钢筋混凝土框架结构办公楼,房屋高度25.45m。抗震设防烈度8度,设防类别丙类,设计基本地震加速度0.2g,设计地震分组第二组,场地类别为Ⅱ类,混凝土强度等级C30。该结构平面和竖向均规则。假定...

体系结构已成昭告后世善莫大焉(体系构架是什么意思)

实践先行也理论已初步完成框架结构留余后人后世子孙俗话说前人栽树后人乘凉在夏商周大明大清民国共和前人栽树下吾之辈已完成结构体系又俗话说青出于蓝而胜于蓝各个时期任务不同吾辈探索框架结构体系经历有限肯定发展...

框架柱抗震构造要求(框架柱抗震设计)

某现浇钢筋混凝土框架-剪力墙结构高层办公楼,抗震设防烈度为8度(0.2g),场地类别为Ⅱ类,抗震等级:框架二级,剪力墙一级,混凝土强度等级:框架柱及剪力墙C50,框架梁及楼板C35,纵向钢筋及箍筋均采...

梁的刚度、挠度控制(钢梁挠度过大会引起什么原因)

某办公楼为现浇钢筋混凝土框架结构,r0=1.0,混凝土强度等级C35,纵向钢筋采用HRB400,箍筋采用HPB300。其二层(中间楼层)的局部平面图和次梁L-1的计算简图如图1~3(Z)所示,其中,K...

死要面子!有钱做大玻璃窗,却没有钱做“柱和梁”,不怕房塌吗?

活久见,有钱做2层落地大玻璃窗,却没有钱做“柱子和圈梁”,这样的农村自建房,安全吗?最近刷到个魔幻施工现场,如下图,这栋5开间的农村自建房,居然做了2个全景落地窗仔细观察,这2个落地窗还是飘窗,为了追...

不是承重墙,物业也不让拆?话说装修就一定要拆墙才行么

最近发现好多朋友装修时总想拆墙“爆改”空间,别以为只要避开承重墙就能随便砸!我家楼上邻居去年装修,拆了阳台矮墙想扩客厅,结果物业直接上门叫停。后来才知道,这种配重墙拆了会让阳台承重失衡,整栋楼都可能变...

取消回复欢迎 发表评论: