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读取xml实例代码
Jan 28 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
Oct 12 PHP
优化PHP程序的方法小结
Feb 23 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
php rsa加密解密使用详解
Jan 14 PHP
php判断访问IP的方法
Jun 19 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
php打乱数组二维数组多维数组的简单实例
Jun 17 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
微信公众号开发之通过接口删除菜单
Feb 20 PHP
PHP获取链表中倒数第K个节点的方法
Jan 18 PHP
php使用pecl方式安装扩展操作示例
Aug 12 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
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
Symfony2安装第三方Bundles实例详解
2016/02/04 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
2016/04/02 PHP
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
浅谈JavaScript中的字符编码转换问题
2015/07/07 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
微信小程序 支付功能(前端)的实现
2017/05/24 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
Python异常处理操作实例详解
2018/05/10 Python
tensorflow: variable的值与variable.read_value()的值区别详解
2018/07/30 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
html5文字阴影效果text-shadow使用示例
2013/07/25 HTML / CSS
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
医学生临床实习自我评价
2014/03/07 职场文书
关键在于落实心得体会
2014/09/03 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
2015年教务工作总结
2015/05/23 职场文书
人与自然观后感
2015/06/16 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript