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 相关文章推荐
桌面中心(一)创建数据库
Oct 09 PHP
利用 window_onload 实现select默认选择
Oct 09 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
PHP使用PHPMailer发送邮件的简单使用方法
Nov 12 PHP
PHP类的反射用法实例
Nov 03 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
Jan 08 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
Feb 26 PHP
PHP读取大文件末尾N行的高效方法推荐
Jun 03 PHP
浅谈php中fopen不能创建中文文件名文件的问题
Feb 06 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
PHP7 mongoDB扩展使用的方法分享
May 02 PHP
php实现映射操作实例详解
Oct 02 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
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
网友原创的PHP模板类代码
2008/09/07 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
javascript document.images实例
2008/05/27 Javascript
js 获取后台的字段 改变 checkbox的被选中的状态 代码
2013/06/05 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
Javascript获取表单名称(name)的方法
2015/04/02 Javascript
javascript中this指向详解
2016/04/23 Javascript
AngularJS  ng-table插件设置排序
2016/09/21 Javascript
layui的table中显示图片方法
2018/08/17 Javascript
NodeJS 文件夹拷贝以及删除功能
2019/09/03 NodeJs
vue项目中锚点定位替代方式
2019/11/13 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
【python】matplotlib动态显示详解
2019/04/11 Python
利用python在excel中画图的实现方法
2020/03/17 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
详解python logging日志传输
2020/07/01 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
2020/12/09 Python
HTML5探秘:用requestAnimationFrame优化Web动画
2018/06/03 HTML / CSS
美国生日蛋糕店:Bake Me A Wish!
2017/02/08 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
教师应聘个人求职信
2013/12/10 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
婚礼答谢礼品
2015/01/20 职场文书
服务员岗位职责范本
2015/04/09 职场文书
农业项目合作意向书
2015/05/08 职场文书
宝宝满月宴答谢词
2015/09/30 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
python中redis包操作数据库的教程
2022/04/19 Python
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js