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(视频)Http下载
Dec 12 PHP
php下将XML转换为数组
Jan 01 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
php中取得文件的后缀名?
Feb 20 PHP
获取URL文件名后缀
Oct 24 PHP
PHP使用JSON和将json还原成数组
Feb 12 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
php恢复数组的key为数字序列的方法
Apr 28 PHP
php计算整个目录大小的方法
Jun 01 PHP
php对接java现实加签验签的实例
Nov 25 PHP
PHP连接MySQL进行增、删、改、查操作
Feb 19 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 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
DedeCms模板安装/制作概述
2007/03/11 PHP
理解PHP中的stdClass类
2014/04/18 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
PHP制作百度词典查词采集器
2015/01/29 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
2016/11/20 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
2018/05/27 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
使用PyInstaller将Python程序文件转换为可执行程序文件
2016/07/08 Python
机器学习10大经典算法详解
2017/12/07 Python
分析python切片原理和方法
2017/12/19 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
python实现的发邮件功能示例
2019/09/11 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
jupyter 导入csv文件方式
2020/04/21 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
中国酒类在线零售网站:酒仙网
2016/08/20 全球购物
苹果Mac升级:MacSales.com
2017/11/20 全球购物
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
校园餐饮创业计划书
2014/01/10 职场文书
导游词之桂林山水
2019/09/20 职场文书
详解JVM系列之内存模型
2021/06/10 Javascript