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 进程锁定问题分析研究
Nov 24 PHP
Linux下安装oracle客户端并配置php5.3
Oct 12 PHP
php获取指定日期之间的各个周和月的起止时间
Nov 24 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
php绘制圆形的方法
Jan 24 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
php版微信公众平台接口开发之智能回复开发教程
Sep 22 PHP
php及codeigniter使用session-cookie的方法(详解)
Apr 06 PHP
PHP中error_reporting函数用法详细介绍
Jun 11 PHP
php两点地理坐标距离的计算方法
Dec 29 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 PHP
PHP与Web页面的交互示例详解二
Aug 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
聊天室php&amp;mysql(一)
2006/10/09 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
vueJS简单的点击显示与隐藏的效果【实现代码】
2016/05/03 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
Python实现线程池代码分享
2015/06/21 Python
Python使用pylab库实现画线功能的方法详解
2017/06/08 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
python 获取微信好友列表的方法(微信web)
2019/02/21 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
英国最大的化装舞会服装网站:Fancydress.com
2017/08/15 全球购物
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
H&M旗下高端女装品牌:& Other Stories
2018/05/07 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
Internal修饰符有什么含义
2013/07/10 面试题
羽毛球比赛策划方案
2014/06/13 职场文书
计算机专业自荐信范文
2015/03/26 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
大学新生入学感想
2015/08/07 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python
html5表单的required属性使用
2021/07/07 HTML / CSS
golang定时器
2022/04/14 Golang