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新手上路(三)
Oct 09 PHP
PHP学习之整理字符串
Apr 17 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
Jul 31 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
Apr 08 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
PHP版QQ互联OAuth示例代码分享
Jul 05 PHP
PHP7.0版本备注
Jul 23 PHP
php数字运算验证码的实现代码
Jul 30 PHP
thinkphp微信开发(消息加密解密)
Dec 02 PHP
thinkphp中字符截取函数msubstr()用法分析
Jan 09 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 30 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分页示例代码
2007/03/19 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
javascript 简练的几个函数
2009/08/29 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
JavaScript实现格式化字符串函数String.format
2016/12/16 Javascript
TypeScript入门-接口
2017/03/30 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
Python之py2exe打包工具详解
2017/06/14 Python
python中时间模块的基本使用教程
2019/05/14 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
Python实现邮件发送的详细设置方法(遇到问题)
2021/01/18 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
三星印度官网:Samsung印度
2019/08/03 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
新浪网技术部笔试题
2016/08/26 面试题
DBA的职责都有哪些
2012/05/16 面试题
餐饮业创业计划书范文
2014/01/06 职场文书
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
初中作文评语集锦
2014/12/25 职场文书
介绍信格式
2015/01/30 职场文书
开票员岗位职责
2015/02/12 职场文书
自荐信格式范文
2015/03/04 职场文书
2015医院个人工作总结范文
2015/05/21 职场文书
退货证明模板
2015/06/23 职场文书
小型婚礼主持词
2015/06/30 职场文书
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers
我国拿下天问一号火星着陆区附近 22 个地理实体命名:平乐、西柏坡、古田、漠河等
2022/04/29 数码科技