PHP函数spl_autoload_register()用法和__autoload()介绍

又是框架冲突导致__autoload()失效,用spl_autoload_register()重构一下,问题解决

__autoload()的用法就不再说了,以前已经在我的WEB开发笔记中说过。PHP __autoload函数(自动载入类文件)的使用方法, 原文地址:http://www.jb51.net/article/29625.htm

说一说,spl_autoload_register()的用法吧,很简单,可以这样理解,就是声明一个自定义__autoload(),你可以是A函数,也可以是B函数,想怎么样就怎么样,函数体的写法,当然要和__autoload()一样就OK 了。

当PHP找不到类文件会调用这个方法,当注册了自己的函数或方法时,PHP不会调用__autoload()函数,而会调用自定义的函数

spl_autoload_register(‘func_name');
spl_autoload_register(array(‘class_name','method_name'));

详细说明如下:

spl_autoload_register
(PHP 5>= 5.1.2)
spl_autoload_register — 注册__autoload()函数
说明
bool spl_autoload_register ([ callback $autoload_function ] )
将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为
spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或
spl_autoload_call()。
参数
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数
spl_autoload()。
返回值
如果成功则返回 TRUE,失败则返回 FALSE。
注:SPL是Standard PHP Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。SPL autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。SPL有两个不同的函数spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。

代码如下:

test.class.php

?
1
2
3
4
5
6
7
8
<?php
class abc{
function __construct()
{
echo 'www.chhua.com;
}
}
?>

load.php

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class LOAD
{
static function loadClass( $class_name )
{
$filename = $class_name . ".class.php" ;
if ( is_file ( $filename )) return include_once $filename ;
}
}
/**
* 设置对象的自动载入
* spl_autoload_register — Register given function as __autoload() implementation
*/
spl_autoload_register( array ( 'LOAD' , 'loadClass' ));
$a = new Test(); //实现自动加载,很多框架就用这种方法自动加载类
?>

spl_autoload_register装载函数的正确写法

AutoLoading\loading

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
namespace AutoLoading;
 
class Loadind {
  public static function autoload( $className ){
         //根据PSR-O的第4点 把 \ 转换层(目录风格符)   DIRECTORY_SEPARATOR ,
     //便于兼容Linux文件找。Windows 下(/ 和 \)是通用的
     //由于namspace 很规格,所以直接很快就能找到
     $fileName = str_replace ( '\\' , DIRECTORY_SEPARATOR, DIR . '\\' . $className ) . '.php' ;
     if ( is_file ( $fileName )) {
       require $fileName ;
     } else {
       echo $fileName . ' is not exist' ; die ;
     }    }  
}

index.php

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//定义当前的目录绝对路径
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();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值