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

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

说一说,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
<span style="color: #000000;font-weight: bold"><?php</span>
<span style="color: #000000;font-weight: bold">class</span> abc<span style="color: #009900">{</span>
<span style="color: #000000;font-weight: bold">function</span> __construct<span style="color: #009900">(</span><span style="color: #009900">)</span>
<span style="color: #009900">{</span>
   <span style="color: #b1b100">echo</span> <span style="color: #0000ff">'www.chhua.com;
}
}
?></span>

load.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<span style="color: #000000;font-weight: bold"><?php</span>
<span style="color: #000000;font-weight: bold">class</span> LOAD
<span style="color: #009900">{</span>
static <span style="color: #000000;font-weight: bold">function</span> loadClass<span style="color: #009900">(</span><span style="color: #000088">$class_name</span><span style="color: #009900">)</span>
<span style="color: #009900">{</span>
   <span style="color: #000088">$filename</span> <span style="color: #339933">=</span> <span style="color: #000088">$class_name</span><span style="color: #339933">.</span><span style="color: #0000ff">".class.php"</span><span style="color: #339933">;</span>
   <span style="color: #b1b100">if</span> <span style="color: #009900">(</span><a rel="noopener noreferrer nofollow" href="http://www.php.net/is_file" rel="noopener noreferrer nofollow" target="_blank"><span style="color: #990000">is_file</span></a><span style="color: #009900">(</span><span style="color: #000088">$filename</span><span style="color: #009900">)</span><span style="color: #009900">)</span> <span style="color: #b1b100">return</span> <span style="color: #b1b100">include_once</span> <span style="color: #000088">$filename</span><span style="color: #339933">;</span>
<span style="color: #009900">}</span>
<span style="color: #009900">}</span>
<span style="color: #009933;font-style: italic">/**
* 设置对象的自动载入
* spl_autoload_register — Register given function as __autoload() implementation
*/</span>
<a rel="noopener noreferrer nofollow" href="http://www.php.net/spl_autoload_register" rel="noopener noreferrer nofollow" target="_blank"><span style="color: #990000">spl_autoload_register</span></a><span style="color: #009900">(</span><a rel="noopener noreferrer nofollow" href="http://www.php.net/array" rel="noopener noreferrer nofollow" target="_blank"><span style="color: #990000">array</span></a><span style="color: #009900">(</span><span style="color: #0000ff">'LOAD'</span><span style="color: #339933">,</span> <span style="color: #0000ff">'loadClass'</span><span style="color: #009900">)</span><span style="color: #009900">)</span><span style="color: #339933">;</span>
<span style="color: #000088">$a</span> <span style="color: #339933">=</span> <span style="color: #000000;font-weight: bold">new</span> Test<span style="color: #009900">(</span><span style="color: #009900">)</span><span style="color: #339933">;</span><span style="color: #666666;font-style: italic">//实现自动加载,很多框架就用这种方法自动加载类</span>
<span style="color: #000000;font-weight: bold">?></span>