目錄
下面我们拿 Yii2 做一次剖析
首頁 後端開發 php教程 PHP 命名空间 namespace / 类别名 use / 框架自动载入 机理的

PHP 命名空间 namespace / 类别名 use / 框架自动载入 机理的

Jun 23, 2016 pm 01:17 PM

从 php 5.3 起 PHP 多了 命名空间/延迟静态绑定/lambda匿名函数 等主要特性

命名空间的引用进一步提升了php的代码结构的灵活性和可控性,方便将项目的各工具类进行归类管理

各 php 框架则是利用命名空间做文件路径映射自动加载的功能 

下面我们拿 Yii2 做一次剖析

先看一下 Yii2的控制器书写规则

controllers\IndexController.php

<?php /** * 自动载入机制 *///==========================================================================================//声明自己的命名空间 此命名空间下的类皆归属于此命名空间管理//==========================================================================================namespace app\controllers;//==========================================================================================//use 声明其实只是为 yii\web\Controller 定义一个别名:Controller 方便我们再上下文中使用//而并非像 C/C++的include JAVA的import将导入的文件加载进来(当然php为解释语言 不存在预编译这一步)//==========================================================================================use yii\web\Controller;//==========================================================================================//IndexController的完整类名其实为 app\controller\IndexController//Controller 为 yii\web\Controller php 解释到此点才会去加载此类//==========================================================================================class IndexController extends Controller {    public function actionIndex() {        //不使用 use 提前声明 手写完整的类名        $model = new \app\models\EntryForm();//注意当前上下文中存在命名空间 所以要从根命名空间 '\' 开始    }}?>
登入後複製

1、某命名空间下的类 的完整名称为 namespace\className,当在某命名空间上下文中访问其它命名空间下的类时,我们可以使用 use 做别名化,或者使用此类的完整名称,但要以 '\' 根命名空间开头,否则解释器会认为你是在当前命名空间上下文中调用,即 foo\bar 方式会以 currentNamespace\foo\bar的方式去加载

命名空间与linux文件系统很相似,'\' 代表根,不以根开始的皆认为以当前命名空间为基点

2、use 只是给你使用的类定义短别名,use foo\bar 后则new bar() 即new \foo\bar(),还有个小技巧,当我们同时引用不同命名空间下的类名相同的类时可以使用 as 为其定义一个新别名

use foo\bar\sameName as classA;use bar\foo\sameName as classB;new classA(); // new \foo\bar\sameName;new classB(); // new \bar\foo\sameName;
登入後複製

3、当我们通过 入口文件 加载参数配置 实例化一个应用主体 加载路由组件解析请求 分派控制器调用方法时,期间会调用其他的类,比如

use yii\web\Controller;
登入後複製

系统便会去通过自动载入函数做最一次载入尝试,若仍加载不到此类则报错

下面我们看下 Yii2 从入口文件开始一个应用实体后注册自动载入函数的流程

index.php

入口文件载入配置和系统框架时会使用require调用,因为现在还没有注册自动加载函数

载入 Yii bootstrap 文件时便通过 spl_autoload_register 注册了自动载入函数 

Yii.php

Yii2的自动载入函数

继承至 BaseYii 它要做的就是根据你命名空间类型的类名去映射为此类所在的文件路径

比如 yii\web\Controller类会根据 yii 而映射到  YII2_PATH . '/web/Controller.php' 文件中,而这个文件则是命名空间为 yii\web 的 Controller 类,将此文件载入即可访问 yii\web\Controller 类

而我们自己编写的控制器或者模型则访问时为 'app\controllers\IndexController' 'app\models\EntryForm'

则 autoload 函数会根据 app 为 映射关键字将其定位到 controllers 或 models 文件夹下从而读取对应的文件即可载入相应的类,这也是为什么 类名 与 文件名 相互对应的原因所在,若不存在对应,则你只能通过固定的 require 某个文件去加载你写在其中的类了 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

php中的捲曲:如何在REST API中使用PHP捲曲擴展 php中的捲曲:如何在REST API中使用PHP捲曲擴展 Mar 14, 2025 am 11:42 AM

PHP客戶端URL(curl)擴展是開發人員的強大工具,可以與遠程服務器和REST API無縫交互。通過利用Libcurl(備受尊敬的多協議文件傳輸庫),PHP curl促進了有效的執行

解釋PHP中晚期靜態結合的概念。 解釋PHP中晚期靜態結合的概念。 Mar 21, 2025 pm 01:33 PM

文章討論了PHP 5.3中介紹的PHP中的晚期靜態結合(LSB),允許靜態方法的運行時間分辨率調用以更靈活的繼承。 LSB的實用應用和潛在的觸摸

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章討論了框架中的基本安全功能,以防止漏洞,包括輸入驗證,身份驗證和常規更新。

如何用PHP的cURL庫發送包含JSON數據的POST請求? 如何用PHP的cURL庫發送包含JSON數據的POST請求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

自定義/擴展框架:如何添加自定義功能。 自定義/擴展框架:如何添加自定義功能。 Mar 28, 2025 pm 05:12 PM

本文討論了將自定義功能添加到框架上,專注於理解體系結構,識別擴展點以及集成和調試的最佳實踐。

ReactPHP的非阻塞特性究竟是什麼?如何處理其阻塞I/O操作? ReactPHP的非阻塞特性究竟是什麼?如何處理其阻塞I/O操作? Apr 01, 2025 pm 03:09 PM

深入解讀ReactPHP的非阻塞特性ReactPHP的一段官方介紹引起了不少開發者的疑問:“ReactPHPisnon-blockingbydefault....

See all articles