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

news2025/1/23 7:04:11

目录

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

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

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

4、运行效果还是一样


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

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

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

<?php
namespace fm;
use ArrayAccess;

class Di implements ArrayAccess{
    protected static $instance;
    protected $instances = [];//已实例化类
    protected  $bind=[
        'core'=>core::class,
    ];//服务列表

    //单例模式 防止多次new
    public static function getInstance(){
        if(self::$instance){
            return self::$instance;
        }
        static::$instance = new static;
        return static::$instance ;

    }
    //获取实例化类
    public static function get($abstract, $vars = []){

        return static::getInstance()->make($abstract, $vars = []);
    }
    //获取类库
    public function make($abstract, $vars = []){

        //先从已经实例化的列表中查找

        if (isset($this->instances[$abstract])) {
            return $this->instances[$abstract];
        }

        //检测有没有注册该服务

        if(!isset($this->bind[$abstract])){
            return null;
        }
        $concrete = $this->bind[$abstract];//对象具体注册内容
        $obj = null;
        //匿名函数方式

        if($concrete instanceof \Closure){
            $obj = call_user_func_array($concrete,$vars);
        }elseif(is_string($concrete)){//字符串方式
            if(empty($vars)){
                $obj = new $concrete;
            }else{
                //带参数的类实例化,使用反射
                $class = new \ReflectionClass($concrete);
                $obj = $class->newInstanceArgs($vars);
            }
        }

        return $obj;
    }
    public function bindTo($abstract, $concrete = null)
    {
        if (is_array($abstract)) {
            $this->bind = array_merge($this->bind, $abstract);
        } elseif ($concrete instanceof Closure) {
            $this->bind[$abstract] = $concrete;
        } elseif (is_object($concrete)) {
            if (isset($this->bind[$abstract])) {
                $abstract = $this->bind[$abstract];
            }
            $this->instances[$abstract] = $concrete;
        } else {
            $this->bind[$abstract] = $concrete;
        }

        return $this;
    }
    //检测是否已经绑定
    public function has($abstract){
        return isset($this->bind[$abstract]) || isset($this->instances[$abstract]);
    }

    //卸载服务
    public function remove($abstract){
        return static::getInstance()->delete($abstract);
    }
    public function delete($abstract)
    {
        unset($this->instances[$abstract]);
    }

    //继承接口必要继承方法
    public function offsetExists($offset) {
        return $this->has($offset);
    }
    public function offsetGet($offset) {
        return $this->make($offset);
    }
    public function offsetSet($offset, $value) {
        $this->bindTo($offset, $value);
    }
    public function offsetUnset($offset) {
        return $this->remove($offset);
    }
    public function getIterator() {
        return new ArrayIterator($this->instances);
    }
    public function count() {
        return count($this->instances);
    }


}

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

<?php
namespace fm;
error_reporting(E_ALL);
ini_set('display_errors', 'On');
// 加载基础文件
require __DIR__ . '/../core/base.php';
Di::get('core')->run();

4、运行效果还是一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

录音怎么转换成mp3格式?支持二十多种格式

录音怎么转换成mp3格式&#xff1f;在我们的日常生活和工作中&#xff0c;录音是一项非常有用的工具&#xff0c;随着手机以及录音设备越来越普及化&#xff0c;让录音这件事情变得非常的简单&#xff0c;录音可以帮助我们解决非常多的事情。例如通过录音&#xff0c;我们可以记…

Linux C++ OpenVINO 物体检测 Demo

目录 main.cpp #include <iostream> #include <string> #include <vector> #include <openvino/openvino.hpp> #include <opencv2/opencv.hpp> #include <dirent.h> #include <stdio.h> #include <time.h> #include …

OJ练习第171题——复制带随机指针的链表

复制带随机指针的链表 力扣链接&#xff1a;138. 复制带随机指针的链表 题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个…

Temu新手入门需要注意哪些细节?如何在Temu中添加尺码?

要在temu平台取得商业成功&#xff0c;创业者们必须注重商品策划和市场调研、关注市场动向和用户反馈、建立良好的互动和交流机制、发挥temu的优势和特点&#xff0c;本文介绍了temu新手入门需要注意细节以及如何在TEMU中添加尺码&#xff0c;快来学习一下吧。 temu新手入门需…

使用Javassist修改组件化 Router

工程目录图 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 代码&#xff1a;TransformDemo

Python中数据去重的重要性、技巧和实现代码

在数据处理和分析的过程中&#xff0c;数据去重是数据处理和分析的关键步骤之一。重复的数据会导致分析结果的偏差&#xff0c;影响决策的准确性。通过数据去重&#xff0c;我们可以确保分析所使用的数据集是干净、准确的&#xff0c;从而提高分析结果的可靠性&#xff0c;Pyth…

【LeetCode题目详解】第十章 单调栈part03 84.柱状图中最大的矩形(day60补)

本文章代码以c为例&#xff01; 一、力扣第84题&#xff1a;柱状图中最大的矩形 题目&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 …

【数据结构】—堆详解(手把手带你用C语言实现)

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f525;这就不得不推荐此专栏了&#xff1a;C语言 ♈️今日夜电波&#xff1a;水星—今泉愛夏 1:10 ━━━━━━️&#x1f49f;──────── 4:23 …

掌控你的Mac——用Bookshelf Library简化文件管理

Bookshelf Library for Mac是一款高效的文件索引管理工具&#xff0c;它可以帮助你轻松整理和查找Mac上的所有文档和书籍。下面我们来看看这款工具的五个特点。 安装&#xff1a;Bookshelf Library for Mac(文件索引管理工具)v6.3.4激活版 第一&#xff0c;Bookshelf Library…

【广州华锐互动】工业零件拆装VR培训:无需前往现场,提高学习效率

工业零件拆装VR培训是一种新兴的培训方式&#xff0c;通过虚拟现实技术将设备拆解过程进行模拟&#xff0c;让学员在虚拟环境中进行实际操作和学习。这种培训方式具有许多益处&#xff0c;本文将对其进行详细阐述。 首先&#xff0c;工业零件拆装VR培训可以提高学员的学习效率。…

好用的软件测试框架有哪些?测试框架的作用是什么?

软件测试框架是现代软件开发过程中至关重要的工具&#xff0c;它可以帮助开发团队更加高效地进行测试和验证工作&#xff0c;从而大大提高软件质量和用户体验。 一、好用的软件测试框架 1. Selenium&#xff1a;作为一种开源的自动化测试框架&#xff0c;Selenium具有功能强大…

【Jmeter】什么是BeanShell?

一、什么是BeanShell&#xff1f; BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器&#xff0c;JMeter性能测试工具也充分接纳了BeanShell解释器&#xff0c;封装成了可配置的BeanShell前置和后置处理器&#xff0c;分别是 BeanShell Pre…

快速打造BI大屏 激活各行业数据价值

BI的概念普遍认为最早由Gartner公司提出&#xff0c;简单可理解为基于现代企业经营理论与信息应用技术系统对信息、数据进行挖掘、分析和处理&#xff0c;最终辅助商业决策的一个企业服务解决方案。 在企业数字化进程中&#xff0c;这样的解决方案主要以信息技术系统为底座&am…

力扣 -- 673. 最长递增子序列的个数

小算法&#xff1a; 通过一次遍历找到数组中最大值出现的次数&#xff1a; 利用这个小算法求解这道题就会非常简单了。 参考代码&#xff1a; class Solution { public:int findNumberOfLIS(vector<int>& nums) {int nnums.size();vector<int> len(n,1);auto…

23.Xaml Frame控件---->导航控件

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

leetcode330. 按要求补齐数组(java)

按要求补齐数组 题目描述贪心算法代码演示 题目描述 难度 - 困难 leetcode - 330. 按要求补齐数组 给定一个已排序的正整数数组 nums &#xff0c;和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中&#xff0c;使得 [1, n] 区间内的任何数字都可以用 nums 中某几…

演讲实录:大模型时代,我们需要什么样的AI算力系统?

当前&#xff0c;“百模大战”带来了算力需求的爆发&#xff0c;AI芯片产业也迎来巨大机遇&#xff0c;“创新架构开源生态”正在激发多元AI算力产品百花齐放。面对新的产业机会&#xff0c;AI算力产业链亟需通过上下游协作共同把握机遇。 近日&#xff0c;浪潮信息AI&HPC…

Unity Shader顶点数据疑问

1&#xff09;Unity Shader顶点数据疑问 2&#xff09;Unity 2018发布在iOS 16.3偶尔出现画面不动的问题 3&#xff09;安卓游戏启动后提示“应用程序异常” 这是第352篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答、社区帖子等技术知…

MCU芯片测试:性能指标测试痛点是什么?ATECLOUD能否解决?

MCU芯片测试指标的核心是性能指标&#xff0c;包括处理器性能、存储器容量和读写速度&#xff0c;外设性能等。芯片测试对自动化测试的要求很高&#xff0c;ATECLOUD-IC不仅解决了传统测试方法的问题&#xff0c;而且也可以满足芯片测试的高要求&#xff0c;高效地完成MCU芯片性…

详解qsort函数的使用及模拟实现qsort函数

目录 引言&#xff1a; 1. qsort函数简介&#xff1a; &#x1f388;qsort函数原型&#xff1a; &#x1f388;函数参数介绍&#xff1a; &#x1f388;比较函数(compar)的编写&#xff1a; &#x1f388;(补充) void*类型的指针&#xff1a; 2.qsort函数示例&#xff1a;…