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:风雨欲来 路在何方?
Oct 09 PHP
PHP4与PHP3中一个不兼容问题的解决方法
Oct 09 PHP
如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量的
Mar 06 PHP
php下使用iconv需要注意的问题
Nov 20 PHP
php产生随机数的两种方法实例代码 输出随机IP
Apr 08 PHP
编写安全 PHP应用程序的七个习惯深入分析
Jun 08 PHP
神盾加密解密教程(三)PHP 神盾解密工具
Jun 08 PHP
PHP中多维数组的foreach遍历示例
Jun 13 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
PHP中使用glob函数实现一句话删除某个目录下的所有文件
Jul 22 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
Jan 20 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
Oct 21 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 前一天或后一天的日期
2008/06/28 PHP
PHP无刷新上传文件实现代码
2011/09/19 PHP
PHP抽象类 介绍
2012/06/13 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
yii2中关于加密解密的那些事儿
2018/06/12 PHP
PHP检查URL包含特定字符串实例方法
2019/02/11 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
jquery制作select列表双向选择示例代码
2014/09/02 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
Node接收电子邮件的实例代码
2017/07/21 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
2019/02/15 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
如何将Node.js中的回调转换为Promise
2020/11/10 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
Python计算字符宽度的方法
2016/06/14 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
法律专业应届本科毕业生求职信
2013/10/25 职场文书
四风存在的原因分析
2014/02/11 职场文书
房屋委托书范本
2014/04/04 职场文书
大学生演讲稿
2014/04/25 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
python 利用 PIL 将数组值转成图片的实现
2021/04/12 Python