当前位置:首页 > PHP教程 > php高级应用 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-27 15:31:59 浏览: 评论:0 

这篇文章主要介绍了PHP命名空间与自动加载类,结合实例形式详细分析了php自动加载类与命名空间原理、使用方法及相关操作注意事项,需要的朋友可以参考下

本文实例讲述了PHP命名空间与自动加载类,分享给大家供大家参考,具体如下:

今天我要给大家介绍的是PHP的命名空间 和 自动加载类

我先简单的分开演示 在放在一起

大家请看:

什么是自动加载类?

想必大家都应该知道__autoload 这个魔术方法

  1. $db = new DB(); 
  2. function __autoload($className
  3. echo $className
  4. exit(); 
  5. //在这个里面引用类 

在运用这个类只能加载一次 ,在很多时候我们要引入的不止一个类这个时候怎么办呢!

牛逼的php大神们  出了个新方法 来解决 这个问题  请看就是这个函数

spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。

这个函数的用法有很多  这里先给大家介绍一种使用方法

如下:

  1. function load1($className
  2. echo 1; 
  3. require $className . '.php'
  4. spl_autoload_register('load1'); //将load1函数注册到自动加载队列中。 
  5. $db = new DB(); //找不到DB类,就会自动去调用刚注册的load1函数了 
  6. //php 5.3之后,也可以像这样支持匿名函数了。 
  7. spl_autoload_register(function($className){ 
  8. if (is_file('./lib/' . $className . '.php')) { 
  9. require './lib/' . $className . '.php'
  10. }); 

多个spl_autoload_register的使用

判断是否有此文件

如果有引入 如果没有 没有如果了,哪来的如果

  1. function load1($className
  2.   echo 1; 
  3.   if (is_file($className . '.php')) { 
  4.     require $className . '.php'
  5.   } 
  6. function load2($className
  7.   echo 2; 
  8.   if (is_file('./app/' . $className . '.php')) { 
  9.     require './app/' . $className . '.php'
  10.   } 
  11. function __autoload($className
  12.   echo 3; 
  13.   if (is_file('./lib/' . $className . '.php')) { 
  14.     require './lib/' . $className . '.php'
  15.   } 
  16. //注册了3个 
  17. spl_autoload_register('load1'); 
  18. spl_autoload_register('load2'); 
  19. spl_autoload_register('__autoload'); 
  20. $db = new DB(); //DB就在本目录下 
  21. $info = new Info(); //Info 在/lib/Info.php 

我们可以打印spl_autoload_functions()函数,来显示一共注册了多少个自动加载:

  1. var_dump(spl_autoload_functions()); 
  2. //数组的形式输出 
  3. array (size=3) 
  4. 0 => string 'load1' (length=5) 
  5. 1 => string 'load2' (length=5) 
  6. 2 => string '__autoload' (length=10) 

命名空间

一个php文件里 是不支持 new 两个名字的

这个时候我们就能用的到命名空间了

  1. namespace app; 
  2. class new
  3. public function ten() 
  4. echo "85"
  5. namespace hii; 
  6. class new
  7. public function ten() 
  8. echo "85"

spl_autoload_register自动加载+namespace命名空间 的使用

废话不多数  看例子

AutoLoading\loading

  1. <?php 
  2. namespace AutoLoading; 
  3. class loading { 
  4. public static function autoload($className
  5.     //把 \ 转换层 / , 便于兼容Linux文件找。Windows 下是通用的 
  6.     //由于namspace 很规格,所以直接很快就能找到 
  7.     $fileName = str_replace('\\', '/', DIR . '\\'. $className) . '.php'; 
  8.     if (is_file($fileName)) { 
  9.     require $fileName
  10.     } else { 
  11.     echo $fileName . ' is not exist'die
  12.     } 
  13.   } 

上面就是一个自动加载的核心思想方法。下面我们就来spl_autoload_register来注册这个函数:

index.php

  1. <?php 
  2. //定义当前的目录绝对路径 
  3. define('DIR', dirname(__FILE__)); 
  4. //加载这个文件 
  5. require DIR . '/loading.php'
  6. //采用`命名空间`的方式注册。php 5.3 加入的 
  7. //也必须是得是static静态方法调用,然后就像加载namespace的方式调用,注意:不能使用use 
  8. spl_autoload_register("\\AutoLoading\\loading::autoload"); 
  9. // 调用三个namespace类 
  10. //定位到Lib目录下的Name.php 
  11. Lib\Name::test(); 
  12. //定位到App目录下Android目录下的Name.php 
  13. App\Android\Name::test(); 
  14. //定位到App目录下Ios目录下的Name.php 
  15. App\Ios\Name::test(); 

由于我们是采用PSR-O方式来定义namespace的命名的,所以很好的定位到这个文件的在哪个目录下了。很爽。对不对。

APP\Android\Name

  1. namespace App\Android; 
  2. class Name 
  3. public function __construct() 
  4. echo __NAMESPACE__ . "<br>"
  5. public static function test() 
  6. echo __NAMESPACE__ . ' static function test <br>'

所以就会很容易找到文件,并输出:

Lib static function test

App\Android static function test

App\Ios static function test

好了。基本的东西就讲完了.

Tags: PHP命名空间 PHP自动加载类

分享到: