php 之 类的自动加载

来源:互联网 发布:网络安全教育文章 编辑:程序博客网 时间:2024/06/08 17:37

  • 引出自动加载
  • 自动加载的简单实现
  • 在引入HumanModel类的问题上我们就可以这样实现
    • 补充说明
  • 自动加载只能用__autoload函数吗

引出自动加载

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