栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

PHP 命名空间

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PHP 命名空间

相比 PHP5.2 版本 PHP5.3 新增了三大主要新特性

命名空间 

延迟静态绑定 

lambda匿名函数

命名空间的出现也使PHP可以更加合理的组织项目结构,同时通过命名空间和自动载入机制一大批 PHP 的 MVC 框架也随之出现,明了的项目结构的同时也按需载入,进一步减轻内存压力,加快执行效率。

因为命名空间是对目录结构友好的

?

12namespace HomeController;class IndexController {}

而 PHP5.2 之前是按造类的下划线去做类似 命名空间 的定义的

?

12class Home_Controller_IndexController  {}


一、 命名空间 及 USE 的本质

php 的 use 关键字并不是立刻导入所use的类,它只是声明某类的完整类名(命名空间::类标示符),而后你在上下文中使用此类时系统才会根据 use 声明获取此类的完整类名 然后利用自动加载机制进行载入

?

namespace HomeController;use HomeModelUser;use HomeModelOrder as OrderList;class IndexController {

 

    public function index() {

        //只有当你调用此类时,系统才会根据 use 声明获取此类的完整类名 然后利用自动加载机制进行载入        $user = new User();

        $order = new OrderList();

    }

}

就像如下的代码 自动载入函数是在 use 两个类之后方才实现的 因为 use 并不会立即使用此类 只有在你调用此类时系统才会在找不到此类的情况下通过 autoload 函数动态延迟加载,若仍加载不到,则报错

 

$app = new SlimApp;

$app->get('/hello/{name}', function (Request $request, Response $response) {

    $name = $request->getAttribute('name');

    $response->getBody()->write("Hello, $name");

    return $response;

});

$app->run();



二、剖析 Yii2 自动载入

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

controllersIndexController.php

 

    public function actionIndex() {

        //不使用 use 提前声明 手写完整的类名        $model = new appmodelsEntryForm();//注意当前上下文中存在命名空间 所以要从根命名空间 '' 开始    }

}?>

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

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

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

?

1use foobarsameName as classA;use barfoosameName as classB;new classA(); // new foobarsameName;new classB(); // new barfoosameName;

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

?

1use yiiwebController;

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

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

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

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

Yii.phpYii2的自动载入函数

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

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

而我们自己编写的控制器或者模型则访问时为 'appcontrollersIndexController' 'appmodelsEntryForm'

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

扩展自己的类库

我们可以通过Yii2的自动载入机制灵活的归类我们自己写的工具类等,比如我想创建一个自己的组件库

你可以定义一个  yiitools 命名空间的类文件 MyTools.php,比如

?

1class MyTools {//.........}?>

放入 vendoryiisoftyii2tools 文件夹下,

通过

?

12// yii一级命名空间 则 映射到 YII_PATH 下// 根据 toolsMyTools 定位到 YII_PATH 下的 tools文件夹下的 MyTools.phpuse yiitoolsMyTools;use yiiwebController;class MyController extends Controller {}?>

当然你也可以在你的项目目录下新建一个 tools 文件夹 把 MyTools.php 放进去,将里面的命名空间改为 apptools 即可,系统会根据 app 映射到项目根目录 通过 toolsMyTools 把 tools文件夹下的 MyTools.php文件载入 即载入了 MyTools 类


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/230136.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号