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代码简化
Feb 08 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
Apr 17 PHP
php验证码实现代码(3种)
Sep 07 PHP
ZF框架实现发送邮件的方法
Dec 03 PHP
php图片上传类 附调用方法
May 15 PHP
PHP文件操作实例总结
Sep 27 PHP
Zend Framework入门教程之Zend_Mail用法示例
Dec 08 PHP
Laravel框架路由设置与使用示例
Jun 12 PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 PHP
如何在PHP中生成随机数
Jun 04 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
smarty的保留变量问题
2008/10/23 PHP
PHP原理之异常机制深入分析
2010/08/08 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
js控制一个按钮是否可点击(可使用)disabled的实例
2017/02/14 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
简析Python的闭包和装饰器
2016/02/26 Python
python版微信跳一跳游戏辅助
2018/01/11 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
Monki官网:斯堪的纳维亚的独立时尚品牌
2020/11/09 全球购物
智能电子应届生求职信
2013/11/10 职场文书
毕业求职自荐信格式是什么
2013/11/19 职场文书
2015年幼儿园毕业感言
2014/02/12 职场文书
婚庆司仪主持词
2014/03/15 职场文书
学生检讨书
2015/01/27 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
MySQL约束超详解
2021/09/04 MySQL
Python 数据可视化之Seaborn详解
2021/11/02 Python
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技