PHP开发自己的框架必备知识点

2022-10-11 22:10:15 206 0
魁首哥

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

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

官方文档:

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

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

1、入口文件 index.php

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

2、自动加载类 Loader.php

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

3、数据库类Database.php

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

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

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

三、PHP魔术方法的使用

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

1、框架入口文件 index.php

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

2、 Extend/Object.php

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

四、三种基础设计模式

1、工厂模式

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

index.php

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

Extend/CacheFactory.php

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

2、 单例模式

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

index.php

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

Extend/SingleObject.php

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

3、注册树模式

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

Extend/RegisterTree,php

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

关于注册树模式,这里推荐一篇文章 ,可以方便理解。

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

1、适配器模式

2、策略模式

3、数据对象映射模式

4、观察者模式

5、原型模式

6、装饰器模式

7、迭代器模式

8、代理模式

收藏
分享
海报
0 条评论
206
上一篇:「原创」PHP实战-XML详细教程 下一篇:利用PHP访问MySql数据库以及增删改查实例操作

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码