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 xml实例 留言本
Mar 20 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
php去除重复字的实现代码
Sep 16 PHP
PHP安全配置详细说明
Sep 26 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
Jun 05 PHP
php中数组首字符过滤功能代码
Jul 31 PHP
php中将汉字转换成拼音的函数代码
Sep 08 PHP
php获取文件大小的方法
Feb 26 PHP
php绘图之加载外部图片的方法
Jan 24 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
php实现在线考试系统【附源码】
Sep 18 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 输出简单动态WAP页面
2009/06/09 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
checkbox 复选框不能为空
2009/07/11 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
jquery+css3实现网页背景花瓣随机飘落特效
2015/08/17 Javascript
jquery实现拖动效果(代码分享)
2017/01/25 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
对vue中methods互相调用的方法详解
2018/08/30 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
JS为什么说async/await是generator的语法糖详解
2019/07/11 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
JavaScript常用工具函数库汇总
2020/09/17 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
Python切片用法实例教程
2014/09/08 Python
Python中的包和模块实例
2014/11/22 Python
Python调用C# Com dll组件实战教程
2017/10/12 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Python同时处理多个异常的方法
2020/07/28 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
医学检验专业大学生求职信
2013/11/18 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
关于召开会议的通知
2015/04/15 职场文书
2015年乡镇安全生产工作总结
2015/05/19 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书