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 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
用php过滤危险html代码的函数
Jul 22 PHP
php实现简单洗牌算法
Jun 18 PHP
PHP延迟静态绑定示例分享
Jun 22 PHP
PHP ignore_user_abort函数详细介绍和使用实例
Jul 15 PHP
php去除字符串中空字符的常用方法小结
Mar 17 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
Windows下编译PHP5.4和xdebug全记录
Apr 03 PHP
php基于openssl的rsa加密解密示例
Jul 11 PHP
thinkPHP通用控制器实现方法示例
Nov 23 PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 PHP
PHP对接阿里云虚拟号的实现(号码隐私保护)
Apr 06 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之预定义接口详解
2015/07/29 PHP
php图片上传类 附调用方法
2016/05/15 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
简单的js表格操作
2016/09/24 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
快速了解vue-cli 3.0 新特性
2018/02/28 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
jQuery创建折叠式菜单
2019/06/15 jQuery
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
Python判断字符串与大小写转换
2015/06/08 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
python学生管理系统的实现
2020/04/05 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
HTML5移动端开发遇见的东西
2019/10/11 HTML / CSS
会计学专业学生的求职信范文
2014/01/27 职场文书
消防宣传口号
2014/06/16 职场文书
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
优质服务标语口号
2015/12/26 职场文书
pygame面向对象的飞行小鸟实现(Flappy bird)
2021/04/01 Python
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
Python pandas之求和运算和非空值个数统计
2021/08/07 Python
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers