美文网首页
__autoload及spl_autoload_register

__autoload及spl_autoload_register

作者: 一只好奇的茂 | 来源:发表于2017-05-14 19:14 被阅读110次

    之前在项目中,都是使用include_once来导入其他class,导致项目中每一个文件都include_once了很多其他文件,最近发现使用spl_autoload_register后,每个文件只需要多定义并调用一个方法即可,具体使用方法如下:

    简介

    一般情况下,都用spl_autoload_register来取代_ _autoload()了,因为spl_autoload_register 可以很好地处理需要多个加载器的情况,这种情况下 spl_autoload_register 会按顺序依次调用之前注册过的加载器。作为对比, __autoload 因为是一个函数,所以只能被定义一次。

    用法

    __autoload()

    我把很多个类文件以 类名.class.php的形式存放在class目录中,在class的同级目录中建立一个index.php。进入class目录里面分别建立class1.class.php、class2.class.php、class3.class.php文件,分别为里面的文件添加一下代码

    <?php
    //class1.class.php中
    class class1{
        public function __construct(){
            echo "class1";
        }
    }
    ?>
    
    <?php
    //class2.class.php中
    class class2{
        public function __construct(){
            echo "class2";
        }
    }
    ?>
    
    <?php
    //class3.class.php中
    class class3{
        public function __construct(){
            echo "class3";
        }
    }
    ?>
    

    index.php文件中写入

    <?php
    function __autoload($classname){
        $filename = "./class/".$classname.".class.php";
        if(is_file($filename)){
            include $filename;
        }
    }
    
    $test1 = new class1();
    echo '<br/>';
    $test1 = new class2();
    echo '<br/>';
    $test1 = new class3();
    
    /*
    结果是
    class1
    class2
    class3
    */
    ?>
    

    我们成功的自动加载了class下面所有的要加载的类。

    spl_autoload_register()

    class里面的文件不做任何改变,只是简单的改写一下index.php

    <?php
    // 写一个loadclass函数
    // loadclass函数不具备自动加载类的功能
    function loadclass($classname){
        $filename = "./class/".$classname.".class.php";
        if(is_file($filename)){
            include $filename;
        }
    }
    // spl_autoload_register()函数让这个loadclass具备了自动加载类的功能
    spl_autoload_register("loadclass");
    
    $test1 = new class1();
    echo '<br/>';
    $test1 = new class2();
    echo '<br/>';
    $test1 = new class3();
    ?>
    

    后记

    因为在每个文件中都定义或调用spl_autoload_register()或autoload()还是显得太麻烦,在后面的开发中,我发现了一个更简单的办法---使用composer来构建项目,这样只需要在每个文件中,加入

    require_once __DIR__.'/vendor/autoload.php';
    

    即可。
    具体做法可参考官方文档:composer基本用法

    相关文章

      网友评论

          本文标题:__autoload及spl_autoload_register

          本文链接:https://www.haomeiwen.com/subject/xqlqxxtx.html