欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP命名空间跟自动加载初探

程序员文章站 2022-05-12 23:53:34
...
PHP命名空间和自动加载初探

参考资料:

PHP手册-语言参考:http://php.net/manual/zh/language.namespaces.php

概要:

1. 声明了命名空间之后,下面的const, function, class都会划归到该命名空间。

2. 只有声明过命名空间的PHP 文件才能加载有命名空间的PHP文件。

3. PHP 5.3 及以上才能使用命名空间

名词:

关键字:namespace 用来声明 本PHP文件的命名空间

常量:__NAMESPACE__ 用来返回当前命名空间的名称 默认为空字符串

操作符: use 默认以最后一个\后的字符串为别名,配合 as 则为 as后的字符串,与MySQL的字段别名一致。

实际操作如下:

在apache目录下建立如下文件:index.php,Order.php,User.php

PHP命名空间跟自动加载初探

Order.php 的内容为

 1 php 2 /** 3  * @Author: Martin 4  * @Support: Martin 5  * @Last Modified by:   Martin 6  */ 7 namespace Order; 8  9 const STR = 'order list
';10 11 function detail()12 {13 return 'order detail
';14 }15 function call_by_self()16 {17 return 'call by self
';18 }19 /**20 *21 */22 class Orderlist23 {24 25 public function __construct()26 {27 echo 'Class NameSpace is "', __NAMESPACE__, '"';28 }29 public function show_list()30 {31 for ($i = 0; $i $i++) {32 echo "
  • this is order$i
    ";33 //内部直接访问34 echo detail();35 echo "
";36 }37 }38 }39 //内部通过命名空间访问40 echo \Order\call_by_self();

index.php 内容为:

 1 php 2 /** 3  * @Author: Martin 4  * @Support: Martin 5  * @Last Modified by:   Martin 6  */ 7 namespace index; 8 include_once('Order.php'); 9 10 //外部访问class 实例化即可使用11 use Order\Orderlist;12 $orderlist = new orderlist;13 $orderlist->show_list();14 15 //外部访问静态变量和function 直接访问16 use Order;17 echo Order\STR;18 echo Order\detail();

打印结果为:

PHP命名空间跟自动加载初探

以上内容包含了:通过命名空间来访问文件和直接实例化访问,以及本空间直接访问。

命名空间的存在是为了防止两个同名的class都被载入,使用命名空间在加载第三方的类时能避免同名冲突。

下面来说一下自动加载

SPL 的全称是:Standard PHP Library PHP标准库,在PHP5以后已经内置在PHP中,无需另外安装。

SPL包含了一套针对数据结构、迭代器、异常、文件处理等的函数库。

自动装载库有以下函数

spl_autoload_call:尝试调用所有已注册的__autoload()函数来装载请求类

User.php 内容为:

1 namespace User;2 //直接载入Order3 #include('Order.php');4 //自动载入5 spl_autoload_register(function($className) {6     var_dump($className);7 });8 spl_autoload_call('Order');

打印结果为:

PHP命名空间跟自动加载初探

SPL自动载入函数包含如下:

spl_autoload_extensions: 注册并返回spl_autoload函数使用的默认文件扩展名。

get_include_path: 设置默认引用的文件夹

spl_autoload_register: 自动引入文件

实际操作如下:

我们重新调整目录结构和并复制order 到 lib下面 如下:

PHP命名空间跟自动加载初探

修改User.php 如下:

 1 namespace User; 2  3 //直接载入Order 4 #include('Order.php'); 5 //自动载入 6 define('LIB_DIR', __DIR__ . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR); 7 spl_autoload_register(function ($class) { 8     $path = LIB_DIR . $class . '.lib.php'; 9     include ($path);10 });11 12 spl_autoload_call('Order');13 use Order;14 15 $orderList = new \Order\Orderlist();16 $orderList->show_list();

打印结果为:

PHP命名空间跟自动加载初探

注意:

当采用SPL载入文件时,use并不能触发spl_autoload_register函数,他会被new触发,这样就会提示找不到文件,

所有采用spl_autoload_call 来提前触发自动载入。

本文地址:http://www.cnblogs.com/martin-tan/p/4864539.html

问题:

使用get_include_path,spl_autoload_extensions并且spl_autoload_register默认为空的情况下并不能直接载入目录下的文件,原因如上。(?)

PHP命名空间跟自动加载初探

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频


网友评论

文明上网理性发言,请遵守 新闻评论服务协议

我要评论
  • PHP命名空间跟自动加载初探
  • 专题推荐

    作者信息
    PHP命名空间跟自动加载初探

    认证0级讲师

    推荐视频教程
  • PHP命名空间跟自动加载初探javascript初级视频教程
  • PHP命名空间跟自动加载初探jquery 基础视频教程
  • 视频教程分类