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蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
PHP的基本常识小结
Jul 05 PHP
php 中文字符串首字母的获取函数分享
Nov 04 PHP
PHP中的替代语法介绍
Jan 09 PHP
php使用Cookie控制访问授权的方法
Jan 21 PHP
PHP中使用socket方式GET、POST数据实例
Apr 02 PHP
PHP curl伪造IP地址和header信息代码实例
Apr 27 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
Oct 26 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
Sep 13 PHP
基于swoole实现多人聊天室
Jun 14 PHP
PHP一个简单的无需刷新爬虫
Jan 05 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数组的维度
2013/06/10 PHP
Javascript 函数对象的多重身份
2009/06/28 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
iframe如何动态创建及释放其所占内存
2014/09/03 Javascript
JSON相关知识汇总
2015/07/03 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
使用jQuery实现两个div中按钮互换位置的实例代码
2017/09/21 jQuery
vue-cli中的webpack配置详解
2017/09/25 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
2018/10/26 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
CSS3实现多背景展示效果通过CSS3定位多张背景
2014/08/10 HTML / CSS
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
法国体育用品商店:GO Sport
2019/10/23 全球购物
琳达·法罗眼镜英国官网:Linda Farrow英国
2021/01/19 全球购物
业务经理岗位职责
2013/11/11 职场文书
同学聚会欢迎辞
2014/01/14 职场文书
铁路工务反思材料
2014/02/07 职场文书
拓展策划方案
2014/06/03 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
2014年终个人总结报告
2015/03/09 职场文书
2015年企业员工工作总结范文
2015/05/21 职场文书
灵魂歌王观后感
2015/06/17 职场文书
什么是Python装饰器?如何定义和使用?
2022/04/11 Python