__autoload 类的自动加载

__autoload

首先,这个方法与__call__set等不一致,他不属于类,但是跟类有关。因为他会在类调用不到时自动调用。

首先,前面我们知道,调用另一个类要么与调用处在一个文件内部,要么就要使用requireinclude等函数,但是当你调用一个类,但是这个类没有进行上述操作时,__autoload就会自动执行。看下面的demon:

文件结构:

  • Controller:文件夹
    • IndexController.php
  • autoload.php
  • index.php

首先来看autoload.php

function __autoload($className){
    // 将命名空间中的 \ 替换成系统文件路径的 /,\\则是因为\代表转义,所以单纯需要一个\的文本就需要转义一次
    $newClassName=str_replace("\\","/",$className);
    // 调用对应的文件
    include_once "./$newClassName.php";
}

很简单,这里就是定义了__autoload

接着简单看一下IndexController.php

namespace Controller;

class IndexController{
    public function output(){
        print "Hello World\n";
    }
}

可以看到这里定义了一个命名空间namespace Controller;

接着看重头戏index.php

require_once "./autoload.php";

use Controller\IndexController;

$index=new IndexController();
$index->output();

可以看到在运行的系统中:

  1. 首先需要调用__autoload,即我们上面定义的autoload.php

  2. 接着就只要关心命名空间的问题了。因为我们这里并没有显式调用IndexController.php__autoload帮我们调用了。

    index.php中当我们尝试实例化IndexController.php中时,系统并没有找到该类,因为原先没有调用该类,接着编译器尝试寻找__autoload方法,找到了,接着运行该方法,在方法中我们include_onceIndexController.php。所以系统正常运行。

猜你喜欢

转载自blog.csdn.net/YQXLLWY/article/details/82945266