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
PHP 中英文混合排版中处理字符串常用的函数
Apr 12 PHP
sqlyog 中文乱码问题的设置方法
Oct 19 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
May 07 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
php链表用法实例分析
Jul 09 PHP
PHP 接入微信扫码支付总结(总结篇)
Nov 03 PHP
PHP实现正则匹配所有括号中的内容
Jun 22 PHP
PHP实现微信商户支付企业付款到零钱功能
Sep 30 PHP
php实现微信企业转账功能
Oct 02 PHP
php和nginx交互实例讲解
Sep 24 PHP
详解phpstorm2020最新破解方法
Sep 17 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中HTML标签过滤技巧
2014/01/07 PHP
详解PHP对数组的定义以及数组的创建方法
2015/11/27 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
Smarty保留变量用法分析
2016/05/23 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
文本域光标操作的jQuery扩展分享
2014/03/10 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
Vue.js学习示例分享
2017/02/05 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
vue实现购物车的监听
2020/04/20 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
Python开发编码规范
2006/09/08 Python
Python中模块string.py详解
2017/03/12 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
使用python计算三角形的斜边例子
2020/04/15 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
学校学雷锋活动总结
2014/06/26 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
2015年科协工作总结
2015/05/19 职场文书
车辆挂靠协议书
2016/03/23 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
python实现手机推送 代码也就10行左右
2022/04/12 Python