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 相关文章推荐
一个没有MYSQL数据库支持的简易留言本的编写
Oct 09 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
浅析php中json_encode()和json_decode()
May 25 PHP
新浪SAE搭建PHP项目教程
Jan 28 PHP
简单谈谈PHP中strlen 函数
Feb 27 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
基于PHP实现通过照片获取ip地址
Apr 26 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
Sep 11 PHP
php删除二维数组中的重复值方法
Mar 12 PHP
PHP实现一个轻量级容器的方法
Jan 28 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
php下的原生ajax请求用法实例分析
Feb 28 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入门之连接mysql数据库的一个类
2012/04/21 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
php 生成签名及验证签名详解
2016/10/26 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
了不起的node.js读书笔记之mongodb数据库交互
2014/12/22 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
javascript将中国数字格式转换成欧式数字格式的简单实例
2016/08/02 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
微信小程序自定义组件components(代码详解)
2019/10/21 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
python处理大数字的方法
2015/05/27 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
pandas 将索引值相加的方法
2018/11/15 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
Python版中国省市经纬度
2020/02/11 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
python不同版本的_new_不同点总结
2020/12/09 Python
澳大利亚家具商店:Freedom
2020/12/17 全球购物
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
新春联欢会主持词
2014/03/24 职场文书
《毛主席在花山》教学反思
2014/04/20 职场文书
工程项目合作意向书
2015/05/08 职场文书
深入理解go缓存库freecache的使用
2022/02/15 Golang
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers