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

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<br />‘;
10
11 function detail()
12 {
13     return ‘order detail<br />‘;
14 }
15 function call_by_self()
16 {
17     return ‘call by self<br />‘;
18 }
19 /**
20  *
21  */
22 class Orderlist
23 {
24
25     public function __construct()
26     {
27         echo ‘Class NameSpace is "‘, __NAMESPACE__, ‘"‘;
28     }
29     public function show_list()
30     {
31         for ($i = 0; $i < 5; $i++) {
32             echo "<ul><li>this is order$i<br />";
33             //内部直接访问
34             echo detail();
35             echo "</li></ul>";
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();

打印结果为:

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

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

下面来说一下自动加载

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

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

自动装载库有以下函数

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

User.php 内容为:

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

打印结果为:

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

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

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

spl_autoload_register: 自动引入文件

实际操作如下:

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

修改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();

打印结果为:

注意:

当采用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默认为空的情况下并不能直接载入目录下的文件,原因如上。(?)

时间: 2024-10-13 04:47:35

PHP命名空间和自动加载初探的相关文章

PHP命名空间与自动加载类详解

本文实例讲述了PHP命名空间与自动加载类.分享给大家供大家参考,具体如下: 今天我要给大家介绍的是PHP的命名空间 和 自动加载类 我先简单的分开演示 在放在一起 大家请看:什么是自动加载类? 想必大家都应该知道__autoload 这个魔术方法 $db = new DB();function __autoload($className){echo $className;exit();//在这个里面引用类} 在运用这个类只能加载一次 ,在很多时候我们要引入的不止一个类这个时候怎么办呢! 牛逼的p

一张图告诉你php的命名空间和自动加载

一张图告诉你php的命名空间,及如何自动加载 PHP的命名空间,这一张图就足够了PHP命名空间和文件的自动加载简单代码,简单几行,就将核心告诉给你! 四哥许坤原创教程,转载请注明出处! 联系方式:[email protected] http://weibo.com/sigexukun

2)thinkphp的带有命名空间的自动加载机制

(1)为啥thinkphp里面的文件要是写你的命名空间,要与你的路径一样,因为在thinkphp实现自动加载机制的原理,就是靠的你的命名空间对应这个路径,然后自动加载机制通过这个路径找到你的类文件,然后进行实例化. (2)命名空间是虚拟的目录,并不是真实存在的目录 (3)其实我觉得  命名空间是可以不一样的,然后那个thinkphp将你的命名空间转化为相应的路径(但是thinkphp中,命名空间就是路径)

PHP 命名空间与自动加载机制

include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 require 堆积.这样的代码既不优雅,执行效率也很低,而且维护起来也相当困难. 为了解决这个问题,部分框架会给出一个引入文件的配置清单,在对象初始化的时候把需要的文件引入.但这只是让代码变得更简洁了一些,引入的效果仍然是差强人意.PHP5 之后,随着 PHP 面向对象支持的完善,__autoload 函

【终于明白】PHP加入命名空间的好处--方便自动加载

一个PHP项目,通常只有一个入口文件index.php,我们通常会在这个入口文件中写入自动加载函数,用来require以后会实例化的类文件.如: spl_autoload_register(function ($className) { require 'class/' . $className . '.php';}); 通过以上的代码,我们发现:在自动加载时,我们需要指定存放类的文件夹,以便找到相应的类.那么问题产生了. 在引入命名空间之前: 我们的项目目录 index.php Control

php命名空间自动加载后使用单独类include使用

普通的命名空间自动加载后,又对框架不熟,在M层或者C层想include直接调用第三方类时通常都不行会报错.原因是有命名空间和自动加载这两个php特性制约. 要解决这两个问题就只要两步即可,但当然在正规项目中不建议使用,要遵循MVC和PCR-0(1.只有一个入口文件:2.在类文件中不能使用直接实现方法的写法:3.命名空间与绝对路径一致)法则,这只是一个偏门技巧. 解决方法 在include文件后,用spl_autoload_unregister()把自动加载的函数注销掉: 如:spl_autolo

laravel的源码解析:PHP自动加载功能原理解析

前言 这篇文章是对PHP自动加载功能的一个总结,内容涉及PHP的自动加载功能.PHP的命名空间.PHP的PSR0与PSR4标准等内容. 一.PHP自动加载功能 PHP自动加载功能的由来 在PHP开发过程中,如果希望从外部引入一个 class,通常会使用 include 和 require 方法,去把定义这个 class 的文件包含进来.这个在小规模开发的时候,没什么大问题.但在大型的开发项目中,使用这种方式会带来一些隐含的问题:如果一个 PHP 文件需要使用很多其它类,那么就需要很多的 requ

自动加载类库

在3.2中,基本上无需手动加载类库文件,你可以很方便的完成自动加载. 命名空间自动加载 系统可以通过类的命名空间自动定位到类库文件,例如: 我们定义了一个类 Org\Util\Auth 类: namespace Org\Util; class Auth { } 保存到 ThinkPHP/Library/Org/Util/Auth.class.php. 接下来,我们就可以直接实例化了. new \Org\Util\Auth(); 在实例化Org\Util\Auth类的时候,系统会自动加载 Thin

thinkphp 自动加载

在3.2中,基本上无需手动加载类库文件,你可以很方便的完成自动加载. 命名空间自动加载 系统可以通过类的命名空间自动定位到类库文件,例如: 我们定义了一个类 Org\Util\Auth 类: namespace Org\Util; class Auth { } 保存到 ThinkPHP/Library/Org/Util/Auth.class.php. 接下来,我们就可以直接实例化了. new \Org\Util\Auth(); 在实例化Org\Util\Auth类的时候,系统会自动加载 Thin