参考资料:
 
概要:
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 的内容为
 

 <?php
/**
* @Author: Martin
* @Support: Martin
* @Last Modified by: Martin
*/
namespace Order; const STR = 'order list<br />'; function detail()
{
return 'order detail<br />';
}
function call_by_self()
{
return 'call by self<br />';
}
/**
*
*/
class Orderlist
{ public function __construct()
{
echo 'Class NameSpace is "', __NAMESPACE__, '"';
}
public function show_list()
{
for ($i = 0; $i < 5; $i++) {
echo "<ul><li>this is order$i<br />";
//内部直接访问
echo detail();
echo "</li></ul>";
}
}
}
//内部通过命名空间访问
echo \Order\call_by_self();

index.php 内容为:

 <?php
/**
* @Author: Martin
* @Support: Martin
* @Last Modified by: Martin
*/
namespace index;
include_once('Order.php'); //外部访问class 实例化即可使用
use Order\Orderlist;
$orderlist = new orderlist;
$orderlist->show_list(); //外部访问静态变量和function 直接访问
use Order;
echo Order\STR;
echo Order\detail();

打印结果为:

以上内容包含了:通过命名空间来访问文件和直接实例化访问,以及本空间直接访问。
命名空间的存在是为了防止两个同名的class都被载入,使用命名空间在加载第三方的类时能避免同名冲突。
 
下面来说一下自动加载
 
SPL 的全称是:Standard PHP Library PHP标准库,在PHP5以后已经内置在PHP中,无需另外安装。
SPL包含了一套针对数据结构、迭代器、异常、文件处理等的函数库。
 
自动装载库有以下函数
spl_autoload_call:尝试调用所有已注册的__autoload()函数来装载请求类

User.php 内容为:

 namespace User;
//直接载入Order
#include('Order.php');
//自动载入
spl_autoload_register(function($className) {
var_dump($className);
});
spl_autoload_call('Order');

打印结果为:

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

spl_autoload_extensions: 注册并返回spl_autoload函数使用的默认文件扩展名。
get_include_path: 设置默认引用的文件夹
spl_autoload_register: 自动引入文件
 
实际操作如下:
我们重新调整目录结构和并复制order 到 lib下面 如下:

修改User.php 如下:

 namespace User;

 //直接载入Order
#include('Order.php');
//自动载入
define('LIB_DIR', __DIR__ . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR);
spl_autoload_register(function ($class) {
$path = LIB_DIR . $class . '.lib.php';
include ($path);
}); spl_autoload_call('Order');
use Order; $orderList = new \Order\Orderlist();
$orderList->show_list();

打印结果为:

注意:
当采用SPL载入文件时,use并不能触发spl_autoload_register函数,他会被new触发,这样就会提示找不到文件,
所有采用spl_autoload_call 来提前触发自动载入。
 
 
 
 
 

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

  1. 【php】命名空间 和 自动加载的关系

    目的 本文的目的主要是说明 命名空间的 use 关键词 和 new ClassName 这两个步骤,哪个步骤才会执行自动加载,这是逻辑有点混乱的表现,这种想法也是很正常的,让我们来解密吧 命名空间(n ...

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

    本文实例讲述了PHP命名空间与自动加载类.分享给大家供大家参考,具体如下: 今天我要给大家介绍的是PHP的命名空间 和 自动加载类 我先简单的分开演示 在放在一起 大家请看:什么是自动加载类? 想必大 ...

  3. PHP 命名空间以及自动加载(自动调用的函数,来include文件)

    这篇文章的目的是记录 1. php中的自动加载函数 __autoload(), 和 spl_autoload_register()函数, 2 .php中命名空间的使用. 一.当不使用命名空间的时候 a ...

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

    include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 requ ...

  5. PHP 命名空间与自动加载机制介绍

    include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 include 和 require 没哟什么不妥,但在大型项目中会造成大量的 include 和 requ ...

  6. PHP 命名空间和自动加载

    PHP 命名空间 php5.3 之后引入了命名空间的特性,从本质上讲,命名空间就是一个容器,你可以将类.函数和变量放在其中,在命名空间中,你可以无条件地访问这些项,在命名空间之外,必须导入或引用命名空 ...

  7. php使用命名空间时自动加载机制

    命名空间主要为了解决用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突.不过并不是你定义了使用命名空间的类,就可以在任何地方随意使用了,需要在程序运行时将定义命名空间的类文 ...

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

    (1)为啥thinkphp里面的文件要是写你的命名空间,要与你的路径一样,因为在thinkphp实现自动加载机制的原理,就是靠的你的命名空间对应这个路径,然后自动加载机制通过这个路径找到你的类文件,然 ...

  9. phper必知必会之类库自动加载的七种方式(三)

    ## php自动加载 下面显示例子的文件目录结构图 一.没有使用命名空间的几种实现 test/oneClass.php class oneClass{ public function show(){ ...

随机推荐

  1. 使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问)

    使用原生JS+CSS或HTML5实现简单的进度条和滑动条效果(精问) 一.总结 一句话总结:进度条动画效果用animation,自动效果用setIntelval 二.使用原生JS+CSS或HTML5实 ...

  2. NOIP模拟 cube - 数学

    题目原文: 豆豆还是觉得自己智商太低了,就又去做数学题了.一看到题,他就觉得自己可能真的一点智商都没有.便哭着跑来像 dalao 求教:如果存在正整数 A,B ,满足 A3 - B3 = x ,则称质 ...

  3. NOIP模拟 - 莫队

    题目描述 给定一个元素个数为 n 的整数数组 a 和 Q 个问题,每个问题有 x,y 两个参数,请统计共有多少个整数 K 满足 K 在 a[x]-a[y] 中出现了恰好 K 次. 输入格式 第一行两个 ...

  4. 【BZOJ 1019】 [SHOI2008]汉诺塔

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1019 [题意] [题解] 这个题解讲得很清楚了 http://blog.sina.co ...

  5. 【序列操作V】平衡树(无旋treap)

    题目描述 维护一个队列,初始为空.依次加入 n(1≤n≤105)个数 ai(-109≤ai≤109),第 i(1≤i≤n)个数加入到当前序列第 bi(0≤bi≤当前序列长度)个数后面.输出最终队列. ...

  6. MapReduce wordcount 输入路径为目录 java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$POSIX.stat(Ljava/lang/String;)Lorg/apache/hadoop/io/nativeio/NativeIO$POSIX$Stat;

    之前windows下执行wordcount都正常,今天执行的时候指定的输入路径是文件夹,然后就报了如题的错误,把输入路径改成文件后是正常的,也就是说目前的wordcount无法对多个文件操作 报的异常 ...

  7. mingw-w64线程模型:posix vs win32(posix允许使用c++11的std:: thread,但要带一个winpthreads,可能需要额外dll)

    我正在安装 mingw-w64 on Windows,有两个选项: win32线程和posix线程. 我知道win32线程和pthreads之间的区别,但是我不明白这两个选项之间的区别. 我怀疑如果我 ...

  8. 五笔字根--good

    https://gss0.baidu.com/94o3dSag_xI4khGko9WTAnF6hhy/zhidao/pic/item/4b90f603738da977b1b5ce57b251f8198 ...

  9. 一款有意思的 Qt 飞行仪表控件

    最近在网上偶然发现一款Qt飞行仪表板控件,真的很酷哦! 是一款开源软件, 直接编译运行:  美工还是不错的! 控件操作非常简单: void MainWindow::timerEvent( QTimer ...

  10. ubuntu 在配置MySQL维修

    第一步 设备MySQL sudo apt-get install mysql-server 第二步骤 构造MySQL 2.1 vim /etc/mysql/my.cnf 到场bind-address ...