php 类加载其它类,PHP 命名空间 namespace / 类别名 use / 框架自动载入 机理的
相比 PHP5.2 版本 PHP5.3 新增了三大主要新特性
命名空间
延迟静态绑定
lambda匿名函数
命名空间的出现也使PHP可以更加合理的组织项目结构,同时通过命名空间和自动载入机制一大批 PHP 的 MVC 框架也随之出现,明了的项目结构的同时也按需载入,进一步减轻内存压力,加快执行效率。
因为命名空间是对目录结构友好的namespace Home\Controller;class IndexController {
}
而 PHP5.2 之前是按造类的下划线去做类似 命名空间 的定义的class Home_Controller_IndexController {
}
一、 命名空间 及 USE 的本质
php 的 use 关键字并不是立刻导入所use的类,它只是声明某类的完整类名(命名空间::类标示符),而后你在上下文中使用此类时系统才会根据 use 声明获取此类的完整类名 然后利用自动加载机制进行载入
namespace Home\Controller;use Home\Model\User;use Home\Model\Order as OrderList;class IndexController {
public function index() {
//只有当你调用此类时,系统才会根据 use 声明获取此类的完整类名 然后利用自动加载机制进行载入 $user = new User();
$order = new OrderList();
}
}
就像如下的代码 自动载入函数是在 use 两个类之后方才实现的 因为 use 并不会立即使用此类 只有在你调用此类时系统才会在找不到此类的情况下通过 autoload 函数动态延迟加载,若仍加载不到,则报错<?phpuse \Psr\Http\Message\ServerRequestInterface as Request;use \Psr\Http\Message\ResponseInterface as Response;require 'vendor/autoload.php';
$app = new \Slim\App;
$app->get('/hello/{name}', function (Request $request, Response $response) {
$name = $request->getAttribute('name');
$response->getBody()->write("Hello, $name");
return $response;
});
$app->run();
二、剖析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 某个文件去加载你写在其中的类了
扩展自己的类库
我们可以通过Yii2的自动载入机制灵活的归类我们自己写的工具类等,比如我想创建一个自己的组件库
你可以定义一个 yii\tools 命名空间的类文件 MyTools.php,比如<?phpnamespace yii\tools;class MyTools {//.........}?>
放入 vendor\yiisoft\yii2\tools 文件夹下,
通过<?phpnamespace app\controllers;// yii一级命名空间 则 映射到 YII_PATH 下// 根据 tools\MyTools 定位到 YII_PATH 下的 tools文件夹下的 MyTools.phpuse yii\tools\MyTools;use yii\web\Controller;class MyController extends Controller {
}?>
当然你也可以在你的项目目录下新建一个 tools 文件夹 把 MyTools.php 放进去,将里面的命名空间改为 app\tools 即可,系统会根据 app 映射到项目根目录 通过 tools\MyTools 把 tools文件夹下的 MyTools.php文件载入 即载入了 MyTools 类
php 类加载其它类,PHP 命名空间 namespace / 类别名 use / 框架自动载入 机理的相关推荐
- roscpp中常用的函数、类以及命名空间
roscpp中常用的函数.类以及命名空间 前言 前言 经过了一段时间的ros与gazebo机器人编队仿真的学习,对ros的结构有了一定了解,接下来将对松灵机器人的底盘进行实车开发,主要开发语言使用C+ ...
- java 类加载器卸载,【深入明白Java虚拟机 】类加载器的命名空间以及类的卸载...
类加载器的命名空间 每个类加载器又有一个命名空间,由其以及其父加载器组成 类加载器的命名空间的作用和影响 每个类加载器又有一个命名空间,由其以及其父加载器组成 在每个类加载器自己的命名空间中不能泛起相 ...
- php 命名空间 函数调用,PHP 命名空间 namespace 函数调用 类引用 详解
PHP namespace 命名空间 函数调用 类引用 详细测试分析 本文测试中,假设index.php页面和test.php页面在同一个根目录下,方便加载test.php页面. 前提条件都是在nam ...
- C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域
1. 命名空间内部名字的查找规则 由内向外依次查找每个外层作用域. 外层作用域也可能是一个或多个嵌套的命名空间, 直到最外层的全局命名空间查找过程终止. 只有位于开放的块中且在使用点之前声明的名字才被 ...
- php定义一个名为Vehicles,[PHP][Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]...
Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...
- PHP 设计模式 笔记与总结(1)命名空间 与 类的自动载入
① PHP 面向对象高级特性 ② 11 种 PHP 设计模式 ③ PSR-0,Composer,Phar 等最流行的技术 目标是掌握 PHP 各类设计模式,以及具备设计纯面向对象框架和系统的能力 [命 ...
- 二.编写第一个c#程序(注释,命名空间,类,Main方法,标识符,关键字,输入,输出语句,)...
复习编写一个控制台应用程序,目标是在控制台输出"Hello World" 1.第一步,打开Visual Studio 2012以上版本(我用的是VS 2015),打开完成后出现以下 ...
- c#中的命名空间、类
重点注意有无分号 using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- 【贪玩巴斯】Unity初学圣经Part2-C#基础——Day 01:C#基础之——命名空间、类、方法、变量的声明赋值和相关知识以及.NETC#关系讲解 2022年3月28日
C#基础之--命名空间.类.方法.变量的声明赋值和相关知识以及.NETC#关系讲解 对应视频4-1至4-7 1.引入命名空间: 2.引入类.方法 3.变量的声明赋值 4.综合小练习 5. .NET的介 ...
最新文章
- python-22 eval json pickle shelve 之间差别
- 攻破Win7~Win10 PatchGuard(KPP DSE)【支持Win10 TH1/TH2/RS1/RS2】【WIN64内核越狱】
- 如何注释python中html,Python在HTML中提取带注释的代码,python,html,被
- 长安渝北工厂机器人_长安UNI-T智能工厂:机器人、激光焊, 一分钟一台车
- python爬虫网页图片并保存到本地
- 计算机专业要学数值分析吗,数值计算方法 数值分析这两门课有什么区别?
- use after free double free利用
- 关于JS按钮倒计时禁用的小Demo
- 【Ubuntu】 Ubuntu16.04系统美化
- There is no getter for property named ‘keyword‘ in ‘class cn.wolfcode.qo.Subentry‘] with root caus
- 剖析拒绝服务攻击-SYN拒绝服务(转)
- 设计性思考维模型及步骤(上)
- 国考计算机三级嵌入式,英语初级视频学习
- jkd8 Stream的使用
- Linux 修复硬盘smart,使用 Smartmontools 检测硬盘坏道
- uni-app图片选择转base64问题,H5与APP端相关实现
- 论文阅读方法与技巧【教授经验】
- 《C》C语言编程实现任意阶数的“m序列”并通过gnuplot绘图——在知道本原多项式的前提下
- 守护进程(Daemon)
- git定位追踪一行或若干行代码修改历史记录