类的自动加载

<?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 里这么做的,自己解决 :)