最近在研究别人的项目的时候,看到了and use的用法,让我很困惑,于是查了很多资料,得出了以下几点结论;
命名空间:
命名空间最明显的用途之一就是解决重名问题。PHP 不允许两个函数或类具有相同的名称,否则将发生致命错误。
需要注意的是:命名空间的命名方式需要和文件夹文件名对应;
使用目的:
在团队项目工作时,避免与其他团队成员新建的类发生冲突;个人负责一个项目时,避免前后新建的类发生冲突;使用需要的类时,需要先导入,所以类重定义错误的前提是导入了两个同名的类。目前部分PHP框架会自动加载(即)所有新建的模型类,所以为了避免你新建的模型类和项目框架原生核心类重名冲突,所以采取了。(想了想,还是通过沟通的方式,避免与团队成员新建的类发生冲突,即使事发后,立即重新调整类名进行维护,避免后期对类的理解混乱造成维护的复杂性)
引入命名空间时,使用关键字use。
自动加载:
1.自动加载的原理及使用
自动加载的原理就是当我们实例化一个类的时候,如果PHP找不到这个类,就会自动调用这个文件中的($)方法,我们new出来的就会成为这个方法的参数。所以我们在这个方法中根据我们需要new出来的各种判断和划分,去相应的路径类文件就可以了,这样就实现了自动加载。
我们先来看一下()的自动调用,例如:
索引.php
如果我们不手动导入Db类的话,程序可能会报错说找不到该类:
致命错误:错误:未在 D:\web\\demo\2017\\index.php:2 中找到类“DB”堆栈跟踪:#0 {main} 位于 D:\web\\demo\2017\\index.php 第 2 行
因此,我们添加这个方法并看一下:
$db = new DB();
function __autoload($className) {
echo $className;
exit();
}
2.r自动加载根据上面自动加载机制的描述,它会输出:Db,这个就是我们需要的新类的类名。因此,此时我们在()方法中根据需要加载类库文件即可。
如果是小项目,用()就可以实现基本的自动加载。但是如果项目很大,或者需要不同的自动加载来加载不同路径的文件,那就悲剧了,因为一个项目中只允许有一个()函数,因为PHP不允许函数名重复,也就是不能声明两个()函数文件,否则会报致命错误。那怎么办呢?别急,你想到的,PHP大神们已经想到了。于是又一个类似r()的牛逼的函数诞生了,替代了它。它更加高效,灵活。
我们先看看如何使用。在index.php中添加以下代码。
在 Lib\Db.php 文件中添加以下代码:
也就是说r可以多次复用,这正是解决的缺点。如果一个页面有多个r,那么执行顺序按照注册的顺序,一个一个执行,如果找到了就停止。运行index.php之后,调用new Db()时,r会自动在lib/目录下寻找对应的Db.php文件,成功后就可以执行$db::test();了。同样的,如果Lib\目录下有多个php类文件,也可以直接在index.php中调用,而不需要使用多个文件。
3. r 自动加载和命名空间
对于非常复杂的系统,目录结构也会非常复杂。标准化的命名空间解决了复杂路径下大量文件、函数、类的重名问题。自动加载现在是现代 PHP 框架的基石,而 R 基本都是用来实现自动加载的。因此,R+ 已经成为主流。
按照PSR系列规范,命名已经很规范了,所以大家可以找到详细的路径,从而找到class文件。
我们用最简单的例子来说明复杂的系统如何自动加载类文件。
首先我们准备系统目录结构:
----/Lib // 类目录
--数据库.php
--Say.php
----.php //自动加载函数
----index.php // 主页
上面是一个基本的系统目录,我们要实现的是在首页index.php中直接利用命名空间、自动加载来调用Lib目录下的多个类。
我们准备两个列文件:
Db.php
上面两个普通的类文件都添加了命名空间:Lib;代表该类文件属于Lib\目录。当然你也可以用其他名字来代表你的项目名。
现在让我们看一下.php:
好的,现在我们在首页index.php上这样调用: 上面的代码利用函数r()首先判断是否使用了命名空间,然后验证要调用的类文件是否存在,如果存在就是该类文件。
?php
use Lib\Db;
use Lib\Say;
require './autoload.php';
$db = new Db();
$db::test();
$say = new Say;
$say->hello();
接下来我们就可以直接调用Lib/目录下的各种类文件了。可以尝试将多个类文件放在Lib/目录下,我们只需要使用一个就可以加载.php,使用use关键字将类文件路径改为绝对路径即可。当然也可以在调用类的时候写上路径,如:new Lib\Db();,但是多个类互相调用的时候会比较麻烦,所以我们还是在文件开头使用use来处理路径。
运行index.php看看它是否按预期工作。
结论
本文就简单介绍了一下自动加载和命名空间的使用。在实际开发中,我们很少会关注自动加载的问题,因为现代的 PHP 框架大多已经处理好了文件自动加载的问题,开发者只需要专注于业务代码,使用标准化的命名空间即可。当然,如果你想开发一个不依赖大型框架的项目,或者自己开发一个 PHP 框架,那么你就得熟悉这个叫做自动加载的好东西,毕竟它可以让我们“偷懒”,省去很多麻烦。
在现代的PHP中,那些我们经常安装的组件都可以被自动加载了,所以还是“懒惰”二字给我们带来了极佳的开发效率。
扫一扫在手机端查看
-
Tags : php 判断use是否导入成功
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。