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 09 PHP
php 全局变量范围分析
Aug 07 PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
Jan 27 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
Apr 17 PHP
php中将时间差转换为字符串提示的实现代码
Aug 08 PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 PHP
php时区转换转换函数
Jan 07 PHP
php数据库备份还原类分享
Mar 20 PHP
ThinkPHP模板比较标签用法详解
Jun 30 PHP
WordPress中邮件的一些修改和自定义技巧
Dec 15 PHP
php时间计算相关问题小结
May 09 PHP
PHP开发API接口签名生成及验证操作示例
May 27 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性能的21种方法介绍
2013/06/25 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
基于php+MySql实现学生信息管理系统实例
2020/08/04 PHP
PHP7 新增功能
2021/03/09 PHP
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
DWR中各种java方法的调用
2016/05/04 Javascript
js不间断滚动的简单实现
2016/06/03 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
JavaScript之map reduce_动力节点Java学院整理
2017/06/29 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
vue仿ios列表左划删除
2019/09/26 Javascript
vue-cli4.x创建企业级项目的方法步骤
2020/06/18 Javascript
python音频处理用到的操作的示例代码
2017/10/27 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
2020/07/20 Python
Django中使用 Closure Table 储存无限分级数据
2019/06/06 Python
python 字典操作提取key,value的方法
2019/06/26 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
Python如何将模块打包并发布
2020/08/30 Python
python try...finally...的实现方法
2020/11/25 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
求∏的近似值,直到最后一项的绝对值小于指定的数
2016/02/12 面试题
餐饮业创业计划书范文
2014/01/06 职场文书
研发工程师岗位职责
2014/04/28 职场文书
文艺晚会策划方案
2014/06/11 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
大二学年个人总结
2015/03/03 职场文书
python中的None与NULL用法说明
2021/05/25 Python