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语法速查表
Dec 06 PHP
PHPMailer安装方法及简单实例
Nov 25 PHP
php中过滤非法字符的具体实现
Oct 29 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
PHP中CheckBox多选框上传失败的代码写法
Feb 13 PHP
php获取excel文件数据
Apr 21 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
Jun 01 PHP
PHP实现SMTP邮件的发送实例
Sep 27 PHP
在laravel中使用with实现动态添加where条件
Oct 10 PHP
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
Apr 11 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中ID设置自增后不连续的原因分析及解决办法
2016/08/21 PHP
PHP简单创建压缩图的方法
2016/08/24 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
动态加载JS文件的三种方法
2013/11/08 Javascript
JS中怎样判断undefined(比较不错的方法)
2014/03/27 Javascript
JavaScript事件委托技术实例分析
2015/02/06 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
angularjs学习笔记之完整的项目结构
2015/09/26 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
vue.js语法及常用指令
2017/10/29 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
深入理解Angularjs 脏值检测
2018/10/12 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
[02:24]DOTA2亚洲邀请赛 NAVI战队出场宣传片
2015/02/07 DOTA
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器
2019/03/11 Python
在Python中使用Neo4j的方法
2019/03/14 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
狼和鹿教学反思
2014/02/05 职场文书
《落花生》教学反思
2014/02/25 职场文书
会计专业求职信范文
2014/03/16 职场文书
高三毕业典礼主持词
2014/03/27 职场文书
2015年学校信息技术工作总结
2015/05/25 职场文书
观后感开头
2015/06/19 职场文书