资讯专栏INFORMATION COLUMN

(转)详解spl_autoload_register()函数

xcc3641 / 3082人阅读

摘要:看到一篇不错的博文,转载过来,可以通过这个自动加载函数来理解的类自动加载原理。在了解这个函数之前先来看另一个函数。调用静态方法另一种写法小结实例化时会被自动触发该函数,如果没有执行的对象时,就会执行该方法。

看到一篇不错的博文,转载过来,可以通过这个自动加载函数spl_autoload_register()来理解PHP的类自动加载原理。

在了解这个函数之前先来看另一个函数:__autoload

一、__autoload

这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。看下面例子:

printit.class.php 
 
 
 
index.php 
 
doPrint();
?>

运行index.php后正常输出hello world。在index.php中,由于没有包含printit.class.php,在实例化printit时,自动调用__autoload函数,参数$class的值即为类名printit,此时printit.class.php就被引进来了。

在面向对象中这种方法经常使用,可以避免书写过多的引用文件,同时也使整个系统更加灵活。

二、spl_autoload_register()

再看 spl_autoload_register(),这个函数与__autoload有与曲同工之妙,看个简单的例子:

doPrint();
?>

将__autoload换成loadprint函数。但是loadprint不会像__autoload自动触发,这时spl_autoload_register()就起作用了,它告诉PHP碰到没有定义的类就执行loadprint()。

spl_autoload_register() 调用静态方法

doPrint();
?>

小结:实例化时__autoload会被自动触发该函数, 如果没有执行的对象时,就会执行spl_autoload_register该方法。

三、composer类自动加载研究

vendor/autoload.php


autoload_real.php

= 50600 && !defined("HHVM_VERSION") && (!function_exists("zend_loader_file_encoded") || !zend_loader_file_encoded());
        if ($useStaticLoader) {
            require_once __DIR__ . "/autoload_static.php";

            call_user_func(ComposerAutoloadComposerStaticInit83cb48187cf44a304a7a6be5e700ede3::getInitializer($loader));
        } else {
            $map = require __DIR__ . "/autoload_namespaces.php";
            foreach ($map as $namespace => $path) {
                $loader->set($namespace, $path);
            }

            $map = require __DIR__ . "/autoload_psr4.php";
            foreach ($map as $namespace => $path) {
                $loader->setPsr4($namespace, $path);
            }

            $classMap = require __DIR__ . "/autoload_classmap.php";
            if ($classMap) {
                $loader->addClassMap($classMap);
            }
        }

        $loader->register(true);

        return $loader;
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30586.html

相关文章

  • 详解spl_autoload_register()函数

    摘要:在了解这个函数之前先来看另一个函数。一这是一个自动加载函数,在中,当我们实例化一个未定义的类时,就会触发此函数。在中,由于没有包含,在实例化时,自动调用函数,参数的值即为类名,此时就被引进来了。 在了解这个函数之前先来看另一个函数:__autoload。 一、__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数。看下面例子: pr...

    hss01248 评论0 收藏0
  • PHP autoload 机制详解

    摘要:但现在问题来了,如果在一个系统的实现中,如果需要使用很多其它的类库,这些类库可能是由不同的开发人员编写的,其类名与实际的磁盘文件的映射规则不尽相同。 PHP在魔术函数__autoload()方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这100个类定义在同一个类文件中——相信这个文件一定会非常大。但...

    psychola 评论0 收藏0
  • PHP 自 5.2 到 5.6 中新增的功能详解

    摘要:本文将会介绍自起,直至中增加的新特征。弃用的功能以下几个功能被弃用,若在配置文件中启用,则会在运行时发出警告。该类的完整限定名是其中第一个反斜杠表示全局命名空间。目的在于模仿的不对,目的是为了让发布应用程序更加方便。 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已经不在维护 [注] 的 PHP5.2, 其余的一半用户在使用 PHP5...

    番茄西红柿 评论0 收藏0
  • 解读 thinkphp5 源码(一):自动加载

    摘要:索性读一下它的源码。行载入类载入类,这个类比较重要,实现了自动加载。注册错误和异常处理机制加载惯例配置文件接下来我们看一下自动加载的实现方法。所以借助此函数可以达到自动加载。博客链接解读源码一自动加载 听说 TP5 已经 RC4 了,曾经在 RC3 的时候用它写过一个小东西。官方说从 RC4 以后改动不是太大。索性读一下它的源码。然后顺便记录一下,如有错漏,请路过大神多多指正! 入口 ...

    stormzhang 评论0 收藏0
  • 自动加载与命名空间

    摘要:不传参数,直接调用,会默认调用来加载类,如果后面再调用有传参数的,也会失效的如果使用了命名空间,那么会把路径和类名一同带过来的。 自动加载 两种实现方式 1、__autoload(); 2、spl_autoload_register(); (主要使用) __autoload()现在很少使用,因为使用这种方式,在一个系统的实现中,假如需要使用很多其它的类库,这些类库可能是由...

    songjz 评论0 收藏0

发表评论

0条评论

xcc3641

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<