类的自动加载
<?php
// 503autoClass.php
header("content-type:text/html;charset=utf-8");
//HumanModel类
class HumanModel {
public function t(){
echo "我是被503autoClass2.php文件加载的",__FILE__,'文件';
}
}
现象
<?php
// 503autoClass2.php
require('./503autoClass.php');
$lisi = new HumanModel();
$lisi->t();
如上,没有require时,报错
手动require进来
如果网站比较大,model类比较多
HumanModel
UserModel
GoodsModel
CartModel
OrderModel
...
...
...
1.这么多的model类,我用谁,就得inclue/require一次
2.而且不知道,之前是否已经 include/require 进来某个类
(这个用once可以解决,但是once的效率很低)
这时,我们就可以用自动加载!
echo "<br>";
function __autoload($c){
echo '=======',$c,'=====';
}
$ming = new Dog();
如果调用某个不存在的类,在报错之前我们还有一次介入的机会
系统会调用 __autoload 函数,并把类名自动传给__autoload函数
我们自然可以在__autoload里,加载需要的类(见下文)
__autoload用法
<?php
header("content-type:text/html;charset=utf-8");
// __autoload 用法
/*
function __autoload($className) {
//把文件名与 $className 写成一样
require('./'.$className.'.php');
}
$lisi = new HumanModel();
*/
function test(){
//函数内可以写任何合法的php代码,包含再声明一个类
class Bird {
public static function sing(){
echo "百灵鸟歌唱";
}
}
}
//Bird::sing(); //Class 'Bird' not found
test();
Bird::sing();
自动注册-spl_autoload_register
自动加载只能用__autoload函数吗?
答:不是的,其实可以指定一个函数
比如 我们就用 zidongjiazai() 函数
注意: 要通知系统,让系统知道,我自己写了一个
自动加载方法,用这个
怎么通知: 用系统函数 spl_autoload_register;
<?php
spl_autoload_register('zidongjiazai');
function zidongjiazai($className){
//把文件名与$className写成一样
require('./'.$className.'.php');
}
// 把文件'503autoClass.php'重新命名为'HumanModel.php';
$lisi = new HumanModel();
__autoload 是一个函数
我能自己注册一个自动加载函数
能否注册类的一个静态方法 当 自动加载函数
TP 里这么做的,自己解决 :)