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 foreach循环使用详解与实例代码
May 08 PHP
PHP错误提示的关闭方法详解
Jun 23 PHP
php实现的css文件背景图片下载器代码
Nov 11 PHP
php上传中文文件名乱码问题处理方案
Feb 03 PHP
php校验表单检测字段是否为空的方法
Mar 20 PHP
Symfony2函数用法实例分析
Mar 18 PHP
php7 安装yar 生成docker镜像
May 09 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
PHP抽象类基本用法示例
Dec 28 PHP
laravel-admin自动生成模块,及相关基础配置方法
Oct 08 PHP
Laravel实现通过blade模板引擎渲染视图
Oct 25 PHP
Laravel框架处理用户的请求操作详解
Dec 20 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
How do I change MySQL timezone?
2008/03/26 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
完美解决IE低版本不支持call与apply的问题
2013/12/05 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
python实现周期方波信号频谱图
2018/07/21 Python
对Python w和w+权限的区别详解
2019/01/23 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
python创建n行m列数组示例
2019/12/02 Python
如何用python 操作zookeeper
2020/12/28 Python
虚拟环境及venv和virtualenv的区别说明
2021/02/05 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
美国批发供应商:Kole Imports
2019/04/10 全球购物
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
高中毕业生自我鉴定范文
2013/09/26 职场文书
自动化系在校本科生求职信
2013/10/23 职场文书
高中自我鉴定范文
2013/11/03 职场文书
个人自我鉴定总结
2014/03/25 职场文书
保护环境倡议书
2014/04/14 职场文书
高中生评语大全
2014/04/25 职场文书
会计求职信
2014/05/29 职场文书
计算机求职信
2014/07/02 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
关于幸福的感言
2015/08/03 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
golang正则之命名分组方式
2021/04/25 Golang
Python加密技术之RSA加密解密的实现
2022/04/08 Python