引出自动加载
我们有一个HumanModel.php,里面的代码如下:
class HumanModel {
public function t() {
echo '人类';
}
}
当我们要在别的php文件中使用HumanModel类的时候:
require('./HumanModel.php');
$lisi = new HumanModel();
$lisi->t();
问题:
如果网站比较大,model类比较多
HumanModel、UserModel、GoodsModel
CatModel、OrderModel
1:这么多的model,我用谁,就得include/require谁.
2:而且不知道,之前是否已经include/require进来某个类
(这个用once可以解决,但once的效率很低)
这时 我们可以用自动加载!
自动加载的简单实现
function __autoload($c) {
echo '~~~~',$c,'~~~~~';
}
$ming = new Pig();
运行这段代码,
说明:
如果调用某个不存在的类,
在报错之前,
我们还有一次介入机会 __autoload函数
系统会调用__autoload()函数,
并把”类名”自动传给__autoload函数
我们自然可以在__autoload里 加载需要的类!
在引入HumanModel类的问题上,我们就可以这样实现
function __autoload($c) {
echo '我先自动加载';
echo './' . $c . '.php';
echo '<br />';
require('./' . $c . '.php');
}
$lisi = new HumanModel();
$lisi->t();
运行:
补充说明
有人会觉的require引入的文件,就相当与把源文件中的内容黏贴到了此处,那此处就相当于在__autoload()的方法中定义了HumanModel类,这样可以吗?
回答:可以
function test() {
// 函数内可以写任何合法的PHP代码,包含再声明一个函数/类
echo '来';
class Bird {
public static function sing() {
echo '百灵鸟儿放声唱!';
}
}
echo '去';
}
Bird::sing(); // Class 'Bird' not found
为什么出错呢?
因为:test()函数还没有执行了
function test() {
// 函数内可以写任何合法的PHP代码,包含再声明一个函数/类
echo '来';
class Bird {
public static function sing() {
echo '百灵鸟儿放声唱!';
}
}
echo '去';
}
test();
Bird::sing();
自动加载只能用__autoload函数吗?
答:不是的,其实也可以指定一个函数
比如 我们就用zidongjiazai()函数
注意:要通知系统,让系统知道–我自己写了一个自动加载方法,用这个!
怎么通知: 用系统函数 spl_auto_register
*/
// 下面这句话,是把zidongjiazai函数注册成为”自动加载函数”;
spl_autoload_register('zidongjiazai');
function zidongjiazai($c) {
echo '我引入了./' . $c . '.php','<br />';
require('./' . $c . '.php');
}
$HumanModel = new HumanModel();
$HumanModel->t();
/**
__autoload 是一个函数
我能自己注册一个自动加载函数
能否注册类的一个静态方法 当 自动加载函数?
TP里这么做的