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开发GUI
Oct 09 PHP
PHP 裁剪图片成固定大小代码方法
Sep 09 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
Jun 05 PHP
apache配置虚拟主机的方法详解
Jun 17 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
PHP遍历XML文档所有节点的方法
Mar 12 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
Dec 31 PHP
PHP Ajax JavaScript Json获取天气信息实现代码
Aug 17 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
php面试中关于面向对象的相关问题
Feb 13 PHP
YII框架模块化处理操作示例
Apr 26 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
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php切割页面div内容的实现代码分享
2012/07/31 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
XENON基于JSON变种
2010/07/27 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
jQuery基础知识小结
2014/12/22 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
vue中使用微信公众号js-sdk踩坑记录
2019/03/29 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
Go语言基于Socket编写服务器端与客户端通信的实例
2016/02/19 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
python如何进入交互模式
2020/07/06 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
给交警的表扬信
2014/01/12 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
绿色校园广播稿
2014/10/13 职场文书
opencv检测动态物体的实现
2021/07/21 Python
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android