Yii2框架源码追踪阅读(一)--从入口脚本index.php到类加载器的初始化

《深入解剖Yii2框架》前言 通过针对Yii2框架的分享,我希望能为大家达到以下两个目标: 第一,从内涵上说——通过对Yii2的解剖,深入理解这个框架的编程思想,掌握各个重要组成部分的构成和用法 第二,从外延上说——通过对这款典型框架的解剖,能举一反三的了解其他PHP框架甚至整个服务端所涉及的重要知识点和涉及内容 阅读详情

        我们以yii2-basic为源码阅读剖析目标,首先,请到http://www.yiichina.com/download 下载框架源码。

        接下来就开始我们的yii2源码阅读之旅吧。

请注意:由于本人会在阅读过程中写入各种注释,有可能导致文章中的代码所在行与实际框架中所在行有出入

 请注明文章来源:http://blog.youkuaiyun.com/lambert310


       从入口脚本index.php开始:
       入口脚本为:web/index.php,这是整个yii2的启动入口:


↑index.php全部内容(请注明文章来源:http://blog.youkuaiyun.com/lambert310)



4、5行见注释即可,我们直接从第7行的类加载器开始,它引入了上一层目录下vendor/autoload.php,其源码如下:


↑autoload.php全部内容


第5行引入了当前目录下/composer/autoload_real.php,然后在第7行调用了getLoader()这个静态方法,我们继续跟踪:

↑autoload_real.php(1-31行)


  在这里看从16行的getLoader()开始,具体可以见代码注释,在第28行将$loader实例化,ClassLoader.php的具体代码稍后剖析,咱们继续往下:

↑autoload_real.php(32-55行),请注明文章来源:http://blog.youkuaiyun.com/lambert310


在这里,由于咱们使用的开发环境是php7.0.6,所以$useStaticLoader为True,接下来引入autoload_static.php,相当于引入了下面的这个ComposerStaticInit9f9e4e27e79990b4ee47bd62041b34f3类,然后调用了getInitializer方法并传入前面的$loader作为参数:


↑autoload_static.php(687行--697行),(请注明文章来源:http://blog.youkuaiyun.com/lambert310)


在这里使用了闭包,具体效果相当于把本类中的多个成员变量绑给了$loader,我们看到这里的$prefixLengthsPsr4,其实就是一个二维数组:


↑autoload_static.php(16行--31行)


然后下一个$prefixDirsPsr4:


↑autoload_static.php(77行--101行)


然后下面的$prefixesPsr0也是大致相同的效果,和前面的区别在于这是一个三维数组,原因可能是受psr4和psr0标准不同的影响:

↑autoload_static.php(190行--206行)

最后把$classMap也绑到loader上,$classMap保存了类到文件的直接映射:

↑autoload_static.php(228行--239行)


然后返回,这样就把这些属性配置绑定到了$loader上。

现在让我们回到autoload_real.php,从56行开始:

↑autoload_real.php(56行--79行)


让我们看到第57行,这里调用了$loader自身的register方法并传入了一个参数为true:

↑ClassLoader.php(279行--282行)

       然后我们回到autoload_real.php,往下看到59行,这里由于$useStaticLoader为True,所以把                       

     autoload_static.php中ComposerStaticInit9f9e4e27e79990b4ee47bd62041b34f3这个类中的$file数组取出:

    

    ↑autoload_statis.php(7行--15行)    

   然后回到前面autoload_real.php的64行,这里把$file中的各文件都require了一遍。


    到这里,咱们的第一篇:《从入口脚本index.php到类加载器的初始化》,就剖析完毕了,

    下一次会带来应用主体初始化的剖析。

PHP文件包含漏洞攻防实战:从原理到防御的完整指南 文件包含是Web开发中常见的动态加载机制,它允许程序在运行时引入外部文件。其核心原理是通过include、require等函数将指定文件内容嵌入当前脚本执行。这一特性在实现模块化开发的同时,若未对包含路径进行严格校验,攻击者可通过构造恶意输入实现路径遍历,从而读取服务器敏感文件甚至执行任意代码,对系统安全构成严重威胁。在PHP环境中,文件包含漏洞常被用于读取配置文件、日志文件,并可通过封装协议或日志注入等技术升级为远程代码执行。针对此类漏洞,最有效的防御策略是采用白名单机制限制可包含文件范围,并结合服务器安 阅读详情

相关推荐

《Yii框架深度剖析》配套代码

《Yii框架深度剖析》配套代码 本书不是简单地介绍如何使用 Yii 框架,而是站在框架设计的高度,从源代码级别深 度剖析。本书首先介绍 PHP 框架技术的概念及其应用领域,然后开始仿照 Yii 框架源代码 自定义框架,其中包括了 MVC 设计模式、单入口模式和应用(前端控制器模式)的实现。 充分了解了这部分知识后,读者对 Yii 框架也有了初步认识,然后正式进入 Yii 框架的学习。

学习yii2.0框架阅读代码(十)

vendor/yiisoft/yii2/base/Module. <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ ...

weixin_30507481的博客 126

Visual studio 2013 配置 Halcon 13 (非抄袭)

Visual studio 2013 配置 Halcon 13.0.2.2 (其他版本适用) 针对网上抄袭的配置方法均不可用,写了一篇亲试可行的配制方法。如下: 1.下载Halcon安装后(C:\Program Files\MVTec\HALCON-13.0) 添加环境变量,(按下win按键,键入“环境变量”,出现 “编辑系统环境变量”后按下enter即可打开,下方找到“环境变量”按钮)的系...

huyanjackson的专栏 1041

YII2框架原理

Yii2.0 路由(Route)的实现原理[ 2.0 版本] https://www.yiichina.com/tutorial/121 Yii2.0 依赖注入(DI)和依赖注入容器的原理[ 2.0 版本 ] https://www.yiichina.com/tutorial/112 Yii2框架底层分析,服务定位器[ 2.0 版本 ] https://www.yiic...

bujidexinq的专栏 1688

UCD9081EVM电源时序管理:硬件配置与GUI操作全解析

电源时序管理是复杂电子系统设计的核心环节,它通过精确控制多路电源的上电/下电顺序,确保核心芯片免受浪涌电流或电压倒灌的损害。其原理基于状态机逻辑与电压监控,技术价值在于将硬连线时序转化为可编程配置,极大提升了系统可靠性与设计灵活性。在服务器、通信设备、工控系统等高可靠性应用场景中,时序控制器是实现稳定启动与故障保护的关键。本文以德州仪器UCD9081评估模块为例,深入剖析其硬件跳线配置与图形用户界面操作,涵盖I2C地址设置、电压监控分压计算、时序条件与故障响应策略等工程实践要点,帮助工程师快速掌握这一电源时

weixin_42696271的博客 302

STM32 SAI接口实战:用CubeMX快速配置多通道音频采集(附DMA优化技巧)

本文详细介绍了如何使用STM32的SAI接口通过CubeMX快速配置多通道音频采集系统,并提供了DMA双缓冲优化技巧。内容涵盖TDM模式配置、时钟同步、DMA优化及常见问题排查,帮助开发者高效实现高速数据采集应用。

weixin_42549037的博客 225

YII2.0配置index.php入口文件至根目录

YII2.0配置入口文件至根目录

咖啡如同生活的专栏 1万+

基因ID转换避坑指南:如何用org.Hs.eg.db把ENSEMBL ID变成可读的gene symbol

本文详细介绍了如何将RNA-seq等数据中常见的ENSEMBL ID转换为可读的基因符号(Gene Symbol),重点对比了biomaRt与org.Hs.eg.db两大工具的优劣,并深入剖析了多对多映射、版本号失效及非编码基因Symbol缺失三大核心陷阱。文章提供了针对TCGA、GEO等不同数据源的定制化处理方案与完整的稳健转换流程,帮助生物信息学分析者避免常见错误,确保下游分析的准确性。

weixin_28223453的博客 700

Yii 2 框架全景解析:组件化架构、适用场景与技术定位(法语官方指南 intro-yii 精读)

Yii 是一个基于组件(component-based)的高性能 PHP 框架,专为快速开发现代 Web 应用而设计。本篇文章以 Yii 2 官方法语指南的开篇章节《Qu'est ce que Yii ?》(什么是 Yii?)为骨架,结合当前仓库(`gh_mirrors/yi/yii2`)中 Yii 2.0 框架核心源码,系统讲解 Yii 的定位、适用场景、与其他框架的差异、版本演进与运行环境要求

gitblog_00210的博客 460

手把手教你学pcie--用Verilog搭建PCIe控制器核心模块

PCIe控制器是硬件设计的核心模块,负责实现设备与主机之间的高速通信。本文将以Verilog语言为例,分步骤讲解如何从零构建一个简化的PCIe控制器核心模块,涵盖事务层(TLP)生成、数据链路层(DLLP)处理和物理层(PHY)接口适配。目标是为嵌入式开发者、FPGA工程师提供一个可扩展的硬件设计框架。​。

MHD0815的博客 339

基于MATLAB的语音声强度和响度分析及处理

综上所述,本文介绍了如何使用MATLAB进行语音信号的声强度和响度分析,并提供了相应的源代码。通过这些工具和方法,可以更好地理解和处理语音信号的声强度和响度特性,为语音信号处理和音频应用提供支持。声强度(Intensity)和响度(Loudness)是语音信号中常用的两个重要参数,用于描述声音的强度和感知响度。响度均衡化:可以通过对语音信号施加不同的加权滤波器,调整信号的频谱分布,从而改变声音的响度。除了分析语音信号的声强度和响度,MATLAB还提供了丰富的工具和函数,用于处理语音信号的声强度和响度。

COWizard的博客 617

大麦自动抢票教程:三步跑通环境、配置与开售

开售瞬间,票档按钮可能一秒钟内就变灰——打开页面、选票档、选场次、填观演人这一串动作,手动做往往来不及。ticket-purchase 是一个大麦自动抢票工具:两套脚本分别驱动 Chrome 和 Android 真机,自动完成选城市、选场次、选票档、填观演人、提交订单,你只需把演出信息写进配置文件。适合愿意自己搭环境、想抢热门场次的人。 ## 先判断它适不适合你 跑之前先对一遍前提,缺哪端就只

gitblog_00911的博客 396

手把手教你学simulink(26.8)--控制算法场景示例:基于强化学习的无人机姿态稳定控制系统

首先,我们需要定义无人机的姿态稳定控制环境。环境包括无人机的状态(姿态角、角速度等)和动作(电机转速)。我们还需要定义奖励函数,用于评估控制器的表现。matlab深色版本% 定义环境% 定义状态空间% 12个状态变量% 定义动作空间% 电机转速范围奖励函数用于评估控制器的表现。我们可以根据无人机的姿态误差、角速度误差以及控制输入的变化率来设计奖励函数。具体来说,当无人机的姿态接近设定值时,给予正奖励;当姿态误差较大或控制输入变化剧烈时,给予负奖励。matlab深色版本。

MHD0815的博客 495

Yii 2 入门通关之后:官方文档体系、扩展生态与社区资源的进阶导航

读完本仓库《权威指南》(The Definitive Guide)的「入门(Getting Started)」章节后,你已经亲手构建出一个完整可运行的 Yii 2 应用,并掌握了表单提交、数据库读写、分页展示与 Gii 代码生成等 Web 开发中最常用的能力。本文作为该章节的收尾篇,为你梳理 Yii 2 官方提供的文档体系、扩展生态与社区渠道,帮助你在完成入门之后建立一条可持续的进阶学习路线——遇

gitblog_00499的博客 186

Winform从入门到精通(21)——ProgressBar(史上最全)

本介绍ProgressBar控件的详细用法,包含所有属性、事件,绝对史上最全!

qq_34059233的博客 3350

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

2026年PHP代码加密实战:从原理到部署的完整指南

PHP作为解释型语言,部署在服务器上的源码天然透明,任何能读取文件的人都能完整复制业务逻辑,这是商业项目交付时面临的最大风险。理解PHP请求生命周期和词法分析机制,是掌握代码加密原理的基础——加密扩展通过拦截文件编译钩子,在内存中解密字节码,让源码不再以明文形式落盘。这类技术不仅保护核心资产,还能与域名锁定、IP锁定、试用期等授权管理深度结合,构建完整的商业化闭环。在实际工程中,无论是传统PHP-FPM环境还是Swoole常驻内存架构,都需要合理选型加密方案并部署Loader扩展,同时配合代码混淆提升逆向门

weixin_34406086的博客 369

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

8 大网盘直链解析免费:一键拿回真实下载地址

LinkSwift(网盘直链下载助手)是一款**免费脚本**,专门做**网盘直链解析**:用各家网盘官方接口,把短期有效的中转地址换回真实下载地址。**无后端、纯本地处理**,链接全程不离开你的设备。 ## 🎯 适合谁用 - 你在网盘里点"下载",浏览器拿到的却是一条几个小时就失效的中转地址 - 想用 IDM、Aria2 这类多线程工具,但手里只有临时链接,喂进去很快就报错 - 文件散落在好

gitblog_00354的博客 357

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Handsontable 版本变更日志全解析:从 18.1 回溯 7.4 的演进脉络、破坏性变更与升级路线

本指南以 [docs/content/guides/upgrade-and-migration/changelog/changelog.md](https://link.gitcode.com/i/07438d4cb39154a54c9d64c396eaf2f2) 为主线,系统梳理 Handsontable 从 7.4.0 到 18.1.1 的官方发布说明:包括每个大版本的核心新增能力、破坏性变更

gitblog_01128的博客 443

六、逐行阅读Yii2.0.43源码_Yii框架文件Container.php(1)

一、属性 学习了6个属性 $_singletons: 保存了单例对象数组 $_definitions 当创建对象的时候,根据其中的值,类型不同,选择不同的创建方式 $_params 构造函数参数 $_reflections 存储ReflectionClass实例 $_dependencies 存储依赖数据 $_resolveArrays 是否要尝试解析$_dependencies中的元素 /** * 保存了单例对象数组 */ private $_s.

mianhuatangVSyeyu的博客 305

修改Yii默认跳转的登录页面地址

'user' => array(             // enable cookie-based authentication             'allowAutoLogin' => true,             'loginUrl'=>array('accounts/login'),         ),

在行进路上的博客 1620

YII2框架详解

yii2框架的安装我们在之前文章中已经提到下面我们开始了解YII2框架 目录篇: MVC篇: 入口文件路径: http://127.0.0.1/yii2/advanced/frontend/web/index.php 为什么我们访问方法会出现url加密呢? 我们找到文件:vendor/yiisoft/yii2/web/UrlManager.php

woshihaiyong168的博客 2万+

十四、逐行阅读Yii2.0.43源码_Yii框架文件Component.php(4)

目录 一、getBehavior方法,返回指定的行为对象 二、getBehaviors方法,返回附加到组件的所有行为 三、attachBehaviorInternal方法,添加行为的核心方法 四、attachBehavior方法,添加行为,实质调用attachBehaviorInternal方法实现 五、attachBehaviors方法,批量添加行为,遍历数组,循环调用attachBehavior方法 六、detachBehavior方法,删除行为 七、detachBehaviors方...

mianhuatangVSyeyu的博客 196

Yii2中的代码自动加载机制

1.基本知识 Include与require 的作用: 当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。 Include与require的区别: 未找到文件则 include 结...

weixin_34174132的博客 301

yii 初始化时如何配置默认访问某个文件?

入口脚本 http://www.yiichina.com/doc/guide/2.0/structure-entry-scripts 应用主体 http://www.yiichina.com/doc/guide/2.0/structure-applications 1. 在启动yii时,入口脚本是应用启动流程中的第一环,一个应用(不管是网页应用还是控制台应用)只有一个入口脚...

weixin_30587025的博客 118

yii2 strace 追踪正在执行的进程

1.  ps -ef | grep php www-data 3250 28792 0 17:02 ? 00:00:01 php-fpm: pool www

Terry - 专注外贸B2C 1622
上一篇: Mysql创建用户后,执行grant授权命令,提示can't find any matching row in the user table
下一篇: Nginx - Location 匹配规则
L瑜
博客等级 码龄14年 133粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值