• PHP自己的框架2.0结合容器技术(重构篇二)


    目录

    1、使用容器实现框架加载类运行

    2、 创建框架容器类core/fm/Di.php

    3、框架使用容器类来执行public/index.php

    4、运行效果还是一样


    1、使用容器实现框架加载类运行

    2、 创建框架容器类core/fm/Di.php

    什么是容器?容器就相当于盒子,把很多类放里面,重复利用,防止多次实例化,节约资源等

    1. namespace fm;
    2. use ArrayAccess;
    3. class Di implements ArrayAccess{
    4. protected static $instance;
    5. protected $instances = [];//已实例化类
    6. protected $bind=[
    7. 'core'=>core::class,
    8. ];//服务列表
    9. //单例模式 防止多次new
    10. public static function getInstance(){
    11. if(self::$instance){
    12. return self::$instance;
    13. }
    14. static::$instance = new static;
    15. return static::$instance ;
    16. }
    17. //获取实例化类
    18. public static function get($abstract, $vars = []){
    19. return static::getInstance()->make($abstract, $vars = []);
    20. }
    21. //获取类库
    22. public function make($abstract, $vars = []){
    23. //先从已经实例化的列表中查找
    24. if (isset($this->instances[$abstract])) {
    25. return $this->instances[$abstract];
    26. }
    27. //检测有没有注册该服务
    28. if(!isset($this->bind[$abstract])){
    29. return null;
    30. }
    31. $concrete = $this->bind[$abstract];//对象具体注册内容
    32. $obj = null;
    33. //匿名函数方式
    34. if($concrete instanceof \Closure){
    35. $obj = call_user_func_array($concrete,$vars);
    36. }elseif(is_string($concrete)){//字符串方式
    37. if(empty($vars)){
    38. $obj = new $concrete;
    39. }else{
    40. //带参数的类实例化,使用反射
    41. $class = new \ReflectionClass($concrete);
    42. $obj = $class->newInstanceArgs($vars);
    43. }
    44. }
    45. return $obj;
    46. }
    47. public function bindTo($abstract, $concrete = null)
    48. {
    49. if (is_array($abstract)) {
    50. $this->bind = array_merge($this->bind, $abstract);
    51. } elseif ($concrete instanceof Closure) {
    52. $this->bind[$abstract] = $concrete;
    53. } elseif (is_object($concrete)) {
    54. if (isset($this->bind[$abstract])) {
    55. $abstract = $this->bind[$abstract];
    56. }
    57. $this->instances[$abstract] = $concrete;
    58. } else {
    59. $this->bind[$abstract] = $concrete;
    60. }
    61. return $this;
    62. }
    63. //检测是否已经绑定
    64. public function has($abstract){
    65. return isset($this->bind[$abstract]) || isset($this->instances[$abstract]);
    66. }
    67. //卸载服务
    68. public function remove($abstract){
    69. return static::getInstance()->delete($abstract);
    70. }
    71. public function delete($abstract)
    72. {
    73. unset($this->instances[$abstract]);
    74. }
    75. //继承接口必要继承方法
    76. public function offsetExists($offset) {
    77. return $this->has($offset);
    78. }
    79. public function offsetGet($offset) {
    80. return $this->make($offset);
    81. }
    82. public function offsetSet($offset, $value) {
    83. $this->bindTo($offset, $value);
    84. }
    85. public function offsetUnset($offset) {
    86. return $this->remove($offset);
    87. }
    88. public function getIterator() {
    89. return new ArrayIterator($this->instances);
    90. }
    91. public function count() {
    92. return count($this->instances);
    93. }
    94. }
    3、框架使用容器类来执行public/index.php
    1. namespace fm;
    2. error_reporting(E_ALL);
    3. ini_set('display_errors', 'On');
    4. // 加载基础文件
    5. require __DIR__ . '/../core/base.php';
    6. Di::get('core')->run();
    4、运行效果还是一样

  • 相关阅读:
    JS中的构造函数
    人类高质量代码—Golang标准库net/rpc
    实例解读丨关于GaussDB ETCD服务异常
    easyRL学习笔记:强化学习基础
    RocketMQ源码阅读(十五)事务消息
    ArcGIS矢量化并进行拓扑检查
    微信小程序|使用小程序制作一个核酸检测点查询工具
    PN结与二极管的特性
    【整数规划】
    【深度学习实验】网络优化与正则化(三):随机梯度下降的改进——Adam算法详解(Adam≈梯度方向优化Momentum+自适应学习率RMSprop)
  • 原文地址:https://blog.csdn.net/weixin_39934453/article/details/132842443