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+Html+缓存
Dec 20 PHP
解析posix与perl标准的正则表达式区别
Jun 17 PHP
CodeIgniter安全相关设置汇总
Jul 03 PHP
使用PHP和HTML5 FormData实现无刷新文件上传教程
Sep 06 PHP
smarty半小时快速上手入门教程
Oct 27 PHP
CI框架中通过hook的方式实现简单的权限控制
Jan 07 PHP
php生成动态验证码gif图片
Oct 19 PHP
Yii框架表单模型和验证用法
May 20 PHP
php图像处理函数imagecopyresampled用法详解
Dec 02 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
PHP实现微信提现功能
Sep 30 PHP
laravel使用数据库测试注意事项
Apr 10 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
PHP4实际应用经验篇(5)
2006/10/09 PHP
php 多个submit提交表单 处理方法
2009/07/07 PHP
基于PHP文件操作的详解
2013/06/05 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
js change,propertychange,input事件小议
2011/12/20 Javascript
使用jQuery实现返回顶部
2015/01/26 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
vue+swiper实现组件化开发的实例代码
2017/10/26 Javascript
es6数值的扩展方法
2019/03/11 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
Python操作MySQL简单实现方法
2015/01/26 Python
window下eclipse安装python插件教程
2017/04/24 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
Python3常见函数range()用法详解
2019/12/30 Python
python tkinter GUI绘制,以及点击更新显示图片代码
2020/03/14 Python
python解压zip包中文乱码解决方法
2020/11/27 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
竞选班长演讲稿
2013/12/30 职场文书
季度思想汇报
2014/01/01 职场文书
工地安全质量标语
2014/06/07 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
Python深度学习之实现卷积神经网络
2021/06/05 Python
常用的Python代码调试工具总结
2021/06/23 Python
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android
python中取整数的几种方法
2021/11/07 Python
关于JavaScript轮播图的实现
2021/11/20 Javascript
python中数组和列表的简单实例
2022/03/25 Python
SpringBoot整合Minio文件存储
2022/04/03 Java/Android