php 之 类的自动加载

引出自动加载

我们有一个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里这么做的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值