PHP类的自动载入程序代码

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

Test1.php

<?php

class Test1 {

    public function func1() {

        return 'test1';

    }

}

?>

Test2.php

<?php

class Test2 {

    public function func2() {

        return 'test2';

    }

}

?>

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

<?php
require ('Test1.php');
require ('Test2.php');
$TestObj1 = new Test1();
$TestObj2 = new Test2();
echo $TestObj1->func1().'<br/>';
echo $TestObj2->func2();
?>

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

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

很方便吧,可是之后__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__.'/'.$class.'.php';
}
function autoload2($class) {
    require __DIR__.'/'.$class.'.php';
}
$TestObj1 = new Test1();
$TestObj2 = new Test2();
echo $TestObj1->func1().'<br/>';
echo $TestObj2->func2();
?>

 

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

static public function start() {

    // 注册AUTOLOAD方法

    spl_autoload_register('Think\Think::autoload');

}

/**

 * 类库自动加载

 * @param string $class 对象类名

 * @return void

 */

public static function autoload($class) {

    // 检查是否存在映射

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

        include self::$_map[$class];

    } elseif (false !== strpos($class,'\\')){

        $name = strstr($class, '\\', true);

        if(in_array($name,array('Think','Org','Behavior','Com','Vendor')) || is_dir(LIB_PATH.$name)){

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

        $path = LIB_PATH;

        }else{

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

            $namespace  =   C('AUTOLOAD_NAMESPACE');

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

        }

        $filename = $path . str_replace('\\', '/', $class) . EXT;

        if(is_file($filename)) {

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

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

                return ;

            }

            include $filename;

        }

    }elseif (!C('APP_USE_NAMESPACE')) {

        // 自动加载的类库层

        foreach(explode(',',C('APP_AUTOLOAD_LAYER')) as $layer){

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

                if(require_cache(MODULE_PATH.$layer.'/'.$class.EXT)) {

                    return ;

                }

            }

        }

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

        foreach (explode(',',C('APP_AUTOLOAD_PATH')) as $path){

            if(import($path.'.'.$class))

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

                return ;

        }

    }

}

 

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, 框架
, 文件
, class
, 函数
代码
小偷程序 php代码、php程序代码、php 摇号程序源代码、php网站程序安装代码、php小马程序代码,以便于您获取更多的相关知识。

时间: 2024-10-25 16:04:44

PHP类的自动载入程序代码的相关文章

深入理解PHP类的自动载入机制_php实例

php的自动加载: 在php5以前,我们要用某个类或类的方法,那必须include或者require,之后才能使用,每次用一个类,都需要写一条include,麻烦 php作者想简单点,最好能引用一个类时,如果当前没有include进来,系统能自动去找到该类,自动引进~ 于是:__autoload()函数应运而生. 通常放在应用程序入口类里面,比如discuz中,放在class_core.php中. 先讲浅显的例子: 第一种情况:文件A.php中内容如下 <?php class A{ public

深入理解PHP类的自动载入机制

php的自动加载: 在php5以前,我们要用某个类或类的方法,那必须include或者require,之后才能使用,每次用一个类,都需要写一条include,麻烦 php作者想简单点,最好能引用一个类时,如果当前没有include进来,系统能自动去找到该类,自动引进~ 于是:__autoload()函数应运而生. 通常放在应用程序入口类里面,比如discuz中,放在class_core.php中. 先讲浅显的例子: 第一种情况:文件A.php中内容如下 <?php class A{ public

php自动载入类用法实例分析_php技巧

本文实例讲述了php自动载入类用法.分享给大家供大家参考,具体如下: <?php //function __autoload($class_name) { // require_once $class_name . '.php'; //} spl_autoload_register(array("core",'autoload'));//当实例化类的时候,自动调用core类中的autoload()方法来载入类 //也可以使用__autoload()来实现,但是php新版本建议使用

ASP程序代码执行时间统计类

程序|统计|执行 ASP程序代码执行时间统计类 第一次写ASP类,实现功能:分段统计程序执行时间,输出统计表等. 程序代码: Class ccClsProcessTimeRecorder''ASP程序代码执行时间统计类  Private ccInti,ccIntNonceTime,ccIntDecimal Private ccIntStartTime,ccIntEndTime,ccIntNow,ccIntNonce Private ccStrInterval,ccStrEvent,ccStrTi

php 类自动载入的方法

  在PHP5之前,各个PHP框架如果要实现类的自动加载,一般都是按照某种约定自己实现一个遍历目录,自动加载所有符合约定规则的文件的类或函数. 当然,PHP5之前对面向对象的支持并不是太好,类的使用也没有现在频繁. 我们来详细探讨下吧. php 类自动载入方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

vc++ 6.0 能自动查找自己编写的程序代码的错误吗??怎么设置,回答最好带着张图片

问题描述 vc++ 6.0 能自动查找自己编写的程序代码的错误吗??怎么设置,回答最好带着张图片 解决方案 程序的错误有两种,一个是语法错误,一个是语义错误. 我们用人类语言打比方: 老虎山羊吃了. 这句话语法错误,主语后面接谓语,谓语后面接宾语,不能颠倒. 一年有356天. 这句话是语义错误,在语法上没有问题,但是显然一年不是356天而是365/366天. 编译器只能发现语法错误.在你的图上,双击最下面那个窗格中的错误信息,可以定位到错误的行,你根据提示修改就可以了. 编译器不能发现语义错误,

class-同一个程序代码,不同的地方new同一个类,内存分配大小不一样

问题描述 同一个程序代码,不同的地方new同一个类,内存分配大小不一样 同样的写法 CLASS A: A* a1=new A: A *a2=new A: 两个语句在代码不同的地方执行而已 new操作符没重载 sizeof(A)得出来的结果是4760, 有人遇到过类似的问题吗,什么原因导致这样的问题, 完全没头绪!!!!!!!!! 解决方案 会不会是内存的对齐产生的问题. 解决方案二: 编译器debug优化关了没

php 类自动载入的方法_php实例

php 类自动载入方法 <?php class inload { /** * 类自动载入,不需要由开发者调用 * * @param string $class 类文件 */ private function autoload( $class ) { if( empty($class) ) { throw new QException('加载文件不存在'.$class); } else { require _SPRING_.'/_Core/SpringMap.php'; //框架地图 if(! f

ASP程序代码执行时间统计类_ASP CLASS类

第一次写ASP类,实现功能:分段统计程序执行时间,输出统计表等. 复制代码 代码如下: Class ccClsProcessTimeRecorder '程序作者:明月星光 '作者主页:http://www.5iya.com/blog 'http://www.kuozhanming.com 'ASP程序代码执行时间统计类   Private ccInti,ccIntNonceTime,ccIntDecimal   Private ccIntStartTime,ccIntEndTime,ccIntN