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 相关文章推荐
使用eAccelerator加密PHP程序
Oct 03 PHP
用php的ob_start来生成静态页面的方法分析
Mar 09 PHP
destoon二次开发入门示例
Jun 20 PHP
Zend Framework页面缓存实例
Jun 25 PHP
WordPress中缩略图的使用以及相关技巧
Nov 24 PHP
Joomla开启SEF的方法
May 04 PHP
[原创]php常用字符串输出方法分析(echo,print,printf及sprintf)
Jul 09 PHP
PHP图形计数器程序显示网站用户浏览量
Jul 20 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
详解php与ethereum客户端交互
Apr 28 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
Aug 15 PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 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
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
PHP XML error parsing SOAP payload on line 1
2010/06/17 PHP
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
Yii2如何批量添加数据
2016/05/17 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
Google Dart编程语法和基本类型学习教程
2013/11/27 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
Python模块搜索路径代码详解
2018/01/29 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
python如何停止递归
2020/09/09 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
关于iframe跨域使用postMessage的实现
2019/10/29 HTML / CSS
世界经理人咨询有限公司面试
2014/09/23 面试题
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
《乡下孩子》教学反思
2014/04/17 职场文书
申论倡议书范文
2014/05/13 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
培训督导岗位职责
2015/04/10 职场文书
介绍信怎么写
2015/05/05 职场文书
Python first-order-model实现让照片动起来
2022/06/25 Python