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


Posted in PHP onSeptember 04, 2018

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

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

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

大家请看:

什么是自动加载类?

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

$db = new DB();
function __autoload($className)
{
echo $className;
exit();
//在这个里面引用类
}

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

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

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

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

如下:

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

多个spl_autoload_register的使用

判断是否有此文件

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

function load1($className)
{
  echo 1;
  if (is_file($className . '.php')) {
    require $className . '.php';
  }
}
function load2($className)
{
  echo 2;
  if (is_file('./app/' . $className . '.php')) {
    require './app/' . $className . '.php';
  }
}
function __autoload($className)
{
  echo 3;
  if (is_file('./lib/' . $className . '.php')) {
    require './lib/' . $className . '.php';
  }
}
//注册了3个
spl_autoload_register('load1');
spl_autoload_register('load2');
spl_autoload_register('__autoload');
$db = new DB(); //DB就在本目录下
$info = new Info(); //Info 在/lib/Info.php

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

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

命名空间

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

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

namespace app;
class new{
public function ten()
{
echo "85";
}
}
namespace hii;
class new{
public function ten()
{
echo "85";
}
}

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

废话不多数  看例子

AutoLoading\loading

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

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

index.php

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

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

APP\Android\Name

namespace App\Android;
class Name
{
public function __construct()
{
echo __NAMESPACE__ . "<br>";
}
public static function test()
{
echo __NAMESPACE__ . ' static function test <br>';
}
}

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

Lib static function test
App\Android static function test
App\Ios static function test

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中实现图片的锐化
Oct 09 PHP
php5 mysql分页实例代码
Apr 10 PHP
解析php中session的实现原理以及大网站应用应注意的问题
Jun 17 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
php解析html类库simple_html_dom(详细介绍)
Jul 05 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
php使用strip_tags()去除html标签仍有空白的解决方法
Jul 28 PHP
php中二分法查找算法实例分析
Sep 22 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
php常用字符串查找函数strstr()与strpos()实例分析
Jun 21 PHP
thinkphp5+layui实现的分页样式示例
Oct 08 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 #PHP
php 后端实现JWT认证方法示例
Sep 04 #PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 #PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 #PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 #PHP
PHP实现的日历功能示例
Sep 01 #PHP
thinkPHP5框架分页样式类完整示例
Sep 01 #PHP
You might like
php中apc缓存使用示例
2013/12/25 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
javascript使用onclick事件改变选中行的颜色
2013/12/30 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
Python模块学习 re 正则表达式
2011/05/19 Python
开始着手第一个Django项目
2015/07/15 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
Python3.6.0+opencv3.3.0人脸检测示例
2018/05/25 Python
深入浅析Python中的迭代器
2019/06/04 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
python自动化发送邮件实例讲解
2021/01/04 Python
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
Agoda香港:全球特价酒店预订
2017/05/07 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
什么是属性访问器
2015/10/26 面试题
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
高校生生产实习自我鉴定
2013/09/21 职场文书
八年级语文教学反思
2014/02/11 职场文书
反腐倡廉警示教育活动心得体会
2014/09/04 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL
JavaScript如何优化逻辑判断代码详解
2021/06/08 Javascript
详解Python类和对象内容
2021/06/22 Python
Python Numpy库的超详细教程
2022/04/06 Python
Django框架模板用法详解
2022/06/10 Python