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中的一个中文字符串截取函数
Feb 14 PHP
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁
Jun 09 PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 PHP
php压缩和解压缩字符串的方法
Mar 14 PHP
PHP内核探索之解释器的执行过程
Dec 22 PHP
PHP实现可自定义样式的分页类
Mar 29 PHP
php单链表实现代码分享
Jul 04 PHP
php字符串函数 str类常见用法示例
May 15 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
Aug 03 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读取csc文件并输出
2015/05/21 PHP
深入理解PHP之源码目录结构与功能说明
2016/06/01 PHP
PHP多进程编程实例详解
2017/07/19 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
img标签中onerror用法
2009/08/13 Javascript
jQuery 使用手册(五)
2009/09/23 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
bootstrap table实现单击单元格可编辑功能
2017/03/28 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
Python库urllib与urllib2主要区别分析
2014/07/13 Python
Python中decorator使用实例
2015/04/14 Python
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
Python书单 不将就
2017/07/11 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
在Python中pandas.DataFrame重置索引名称的实例
2018/11/06 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
竞选班干部演讲稿
2014/04/24 职场文书
2014年班干部工作总结
2014/11/25 职场文书
离婚案件原告代理词
2015/05/23 职场文书
主题班会开场白
2015/06/01 职场文书
2015年行政管理人员工作总结
2015/10/15 职场文书
2016年小学党支部创先争优活动总结
2016/04/05 职场文书
入党心得体会
2019/06/20 职场文书
我的暑假生活作文(五年级)范文
2019/08/07 职场文书
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
Django实现drf搜索过滤和排序过滤
2021/06/21 Python