Home > php教程 > PHP源码 > body text

PHP类的自动载入程序代码

WBOY
Release: 2016-06-08 17:20:26
Original
1166 people have browsed it

自动载入类在php中魔术方法了,我们可以通过php中的_autoload方法来实现了,下面一起来看一篇关于PHP类的自动载入程序代码,希望本文章对各位有帮助。

<script>ec(2);</script>


加入我们现在有两个PHP文件,内容如下:

Test1.php

<?php

class Test1 {

    public function func1() {

        return &#39;test1&#39;;

    }

}

?>
Copy after login

Test2.php

<?php

class Test2 {

    public function func2() {

        return &#39;test2&#39;;

    }

}

?>
Copy after login

然而在需要载入这两个文件时,传统的写法是这样的:

<?php
require (&#39;Test1.php&#39;);
require (&#39;Test2.php&#39;);
$TestObj1 = new Test1();
$TestObj2 = new Test2();
echo $TestObj1->func1().&#39;<br/>&#39;;
echo $TestObj2->func2();
?>
Copy after login

现在我们使用PHP类的自动载入,只需要定义 __autoload() 方法既可将类自动载入,方法如下:

<?php
//define autoload function
function __autoload($class) {
    require __DIR__.&#39;/&#39;.$class.&#39;.php&#39;;
}
$TestObj1 = new Test1();
$TestObj2 = new Test2();
echo $TestObj1->func1().&#39;<br/>&#39;;
echo $TestObj2->func2();
?>
Copy after login

很方便吧,可是之后__autoload这个函数被废弃掉了,主要原因是因为,我们一个PHP的项目可能会依赖多个框架,如果我们每一个框架都拥有这个函数,那么程序就会报一个函数重复定义的致命错误。当然不用担心,在PHP5.3之后呢,官方提供了一个 spl_autoload_register() 函数来取代 __autoload,这个函数的特点是它允许你存在多个相同的载入函数,即使我写了多个载入,也不会出现任何问题,代码如下:

<?php
spl_autoload_register(autoload1);
spl_autoload_register(autoload2);
//define autoload function
function autoload1($class) {
    require __DIR__.&#39;/&#39;.$class.&#39;.php&#39;;
}
function autoload2($class) {
    require __DIR__.&#39;/&#39;.$class.&#39;.php&#39;;
}
$TestObj1 = new Test1();
$TestObj2 = new Test2();
echo $TestObj1->func1().&#39;<br/>&#39;;
echo $TestObj2->func2();
?>
Copy after login

这种方法会更先进一些,也是我们采用的最主要的方法。博主最近开发的项目使用的是ThinkPHP框架,就在框架的核心文件Think.class.php中找到它的自动载入函数,拷过来给大家看下。

static public function start() {

    // 注册AUTOLOAD方法

    spl_autoload_register(&#39;Think\Think::autoload&#39;);

}

/**

 * 类库自动加载

 * @param string $class 对象类名

 * @return void

 */

public static function autoload($class) {

    // 检查是否存在映射

    if(isset(self::$_map[$class])) {

        include self::$_map[$class];

    } elseif (false !== strpos($class,&#39;\\&#39;)){

        $name = strstr($class, &#39;\\&#39;, true);

        if(in_array($name,array(&#39;Think&#39;,&#39;Org&#39;,&#39;Behavior&#39;,&#39;Com&#39;,&#39;Vendor&#39;)) || is_dir(LIB_PATH.$name)){

        // Library目录下面的命名空间自动定位

        $path = LIB_PATH;

        }else{

            // 检测自定义命名空间 否则就以模块为命名空间

            $namespace  =   C(&#39;AUTOLOAD_NAMESPACE&#39;);

            $path = isset($namespace[$name])? dirname($namespace[$name]).&#39;/&#39; : APP_PATH;

        }

        $filename = $path . str_replace(&#39;\\&#39;, &#39;/&#39;, $class) . EXT;

        if(is_file($filename)) {

            // Win环境下面严格区分大小写

            if (IS_WIN && false === strpos(str_replace(&#39;/&#39;, &#39;\\&#39;, realpath($filename)), $class . EXT)){

                return ;

            }

            include $filename;

        }

    }elseif (!C(&#39;APP_USE_NAMESPACE&#39;)) {

        // 自动加载的类库层

        foreach(explode(&#39;,&#39;,C(&#39;APP_AUTOLOAD_LAYER&#39;)) as $layer){

            if(substr($class,-strlen($layer))==$layer){

                if(require_cache(MODULE_PATH.$layer.&#39;/&#39;.$class.EXT)) {

                    return ;

                }

            }

        }

        // 根据自动加载路径设置进行尝试搜索

        foreach (explode(&#39;,&#39;,C(&#39;APP_AUTOLOAD_PATH&#39;)) as $path){

            if(import($path.&#39;.&#39;.$class))

                // 如果加载类成功则返回

                return ;

        }

    }

}
Copy after login

 

更多的相关知识大家可以自行去搜索,或者查看相关手册。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template