PHP 命名空间和自动加载原理与用法实例分析


Posted in PHP onApril 29, 2020

本文实例讲述了PHP 命名空间和自动加载原理与用法。分享给大家供大家参考,具体如下:

PHP 命名空间

php5.3 之后引入了命名空间的特性,从本质上讲,命名空间就是一个容器,你可以将类、函数和变量放在其中,在命名空间中,你可以无条件地访问这些项,在命名空间之外,必须导入或引用命名空间,才能访问它所包含的项。

声明命名空间

namespace my;
require_one 'outputter3.php';

class outputter {
  // 输出数据
  public function helloworld() {
    echo "hello world!";
  }

}

namespace useful;

class outputter {

}

namespace 关键字用于创建命名空间,而且一般声明命名空间时,namespace 必须发到文件中的第一句,PHP还支持声明嵌套的命名空间,如

namespace com\getinstance\util;

使用命名空间

在本命名空间内部可以直接调用命名空间中的类或函数、变量,

因为我已经位于命名空间中了,所以不必在类名前加任何种类的路径,

如果打算从命名空间环境之外访问类,可以使用:

com\getinstance\util\Debug::helloworld();

以下代码将会报错:

namespace main;

com\getinstance\util\Debug::helloworld();

因为使用的相对命名空间,PHP会在 main 命名空间中寻找 com\getinstance\util,但没有找到,就像创建绝对 URL 和文件路径时,以分隔符作为开始一样,你也可以使用这种方式创建绝对命名空间,如下:

namespace main;

\com\getinstance\util\Debug::helloworld();

前导的反斜杠告诉 PHP 从根命名空间而不是从当前命名空间开始搜索。

但是如果每次调用命名空间都需要写这么长的一串前缀是不合理的,PHP 可以使用 use 关键词为当前命名空间中的其他命名空间起别名,如下:

namespace main;
use com\getinstance\util;

util\Debug::helloworld();

导入 com\getinstance\util,并隐式地为其使用了别名 util

如果不想引入命名空间,可以导入 Debug 类本身:

namespace main;
use com\getinstance\util\Debug;

util\Debug::helloworld();

关键字 use 之后使用 as,可以将别名 Debug 修改为 uDebug

namespace main;
use com\getinstance\util\Debug as uDebug;

uDebug::helloworld();

在命名空间中访问全局空间(非命名空间),可以在该全局类前加反斜杠:

namespace com\getinstance\util;
require "global.php";

\Lister::helloworld();  //访问全局空间
Lister::helloworld();  //访问本地命名空间

使用 __NAMESPACE__ 常量可以输出当前的命名空间,在调试时有用。

自动加载

PHP5 引入了 __autoload() 方法来自动包含类文件,当 PHP 引擎遇到试图实例化未知类的操作时,会调用 __autoload() 方法(如果已经定义),并将类名当作字符串参数传递给它,编写 __autoload() 时,应该定义一种策略来定位和包含缺失的类文件。如下:

function __autoload($classname) {
  include_once("$classname.php");
}
$product = new ShopProduct();

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP程序61条面向对象分析设计的经验小结
Nov 12 PHP
php empty,isset,is_null判断比较(差异与异同)
Oct 19 PHP
探讨各种PHP字符串函数的总结分析
Jun 05 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
Mar 07 PHP
PHP实现无限分类的实现方法
Nov 14 PHP
利用PHP实现开心消消乐的算法示例
Oct 12 PHP
学习thinkphp5.0验证类使用方法
Nov 16 PHP
PHP实现的获取文件mimes类型工具类示例
Apr 08 PHP
php如何把表单内容提交到数据库
Jul 08 PHP
docker-compose部署php项目实例详解
Jul 30 PHP
laravel实现按月或天或小时统计mysql数据的方法
Oct 09 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
Apr 29 #PHP
Thinkphp集成抖音SDK的实现方法
Apr 28 #PHP
PHP扩展类型及安装方式解析
Apr 27 #PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 #PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
Apr 27 #PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
Apr 27 #PHP
Thinkphp 框架扩展之驱动扩展实例分析
Apr 27 #PHP
You might like
PHP 5.3新特性命名空间规则解析及高级功能
2010/03/11 PHP
php文件怎么打开 如何执行php文件
2011/12/21 PHP
header导出Excel应用示例
2014/01/24 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
Linux平台php命令行程序处理管道数据的方法
2016/11/10 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
laravel入门知识点整理
2020/09/15 PHP
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
对比分析json及XML
2014/11/28 Javascript
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
详解Matlab中 sort 函数用法
2016/03/20 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
Python字符遍历的艺术
2008/09/06 Python
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
Python字符串替换实例分析
2015/05/11 Python
在Django的通用视图中处理Context的方法
2015/07/21 Python
python正则表达式之对号入座篇
2018/07/24 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
python cumsum函数的具体使用
2019/07/29 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
德国2018年度最佳在线药房:Bodfeld Apotheke
2019/11/04 全球购物
linux面试题参考答案(8)
2015/08/11 面试题
文员个人的求职信范文
2013/09/26 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
Python中常见的导入方式总结
2021/05/06 Python
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python
MySQL transaction事务安全示例讲解
2022/06/21 MySQL