关闭

php 之 类的自动加载

标签: php函数
85人阅读 评论(0) 收藏 举报
分类:

引出自动加载

我们有一个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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9368次
    • 积分:389
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:8篇
    • 译文:0篇
    • 评论:0条
    文章存档