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+JS无限级可伸缩菜单详解(简单易懂)
Jan 02 PHP
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
Jun 11 PHP
javascript,php获取函数参数对象的代码
Feb 03 PHP
PHP 无限分类三种方式 非函数的递归调用!
Aug 26 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
Nov 10 PHP
php inc文件使用的风险和注意事项
Nov 12 PHP
php实现源代码加密的方法
Jul 11 PHP
汇总PHPmailer群发Gmail的常见问题
Feb 24 PHP
eclipse php wamp配置教程
Jun 30 PHP
PHP创建自己的Composer包方法
Apr 09 PHP
Laravel find in set排序实例
Oct 09 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
Oct 10 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
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
php修改数组键名的方法示例
2017/04/15 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
js实现点击左右按钮轮播图片效果实例
2015/01/29 Javascript
基于Jquery代码实现手风琴菜单
2015/11/19 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
基于JS递归函数细化认识及实用实例(推荐)
2017/08/07 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
python访问纯真IP数据库的代码
2011/05/19 Python
简介Django框架中可使用的各类缓存
2015/07/23 Python
python书籍信息爬虫实例
2018/03/19 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
对python调用RPC接口的实例详解
2019/01/03 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
物流专业大学的自我评价
2014/01/11 职场文书
庆八一活动方案
2014/01/25 职场文书
党员剖析材料范文
2014/09/30 职场文书
军人离婚协议书样本
2014/10/21 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
python-for x in range的用法(注意要点、细节)
2021/05/10 Python
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS