php的spl_autoload_register函数的一点个人见解

这是一篇对spl_autoload_register()函数的个人简单介绍,有需要的同学可以参考,主要是讨论spl_autoload_register()函数所注册的函数的参数的个人一点迷惑。

废话不多说,上代码,还请同学注意看注释。

<?php
    //定义一个函数,功能自动加载类文件
    function autoload($class){
        //参数$class,不用管它,它自己会以``类的名称``作为参数
        //类文件的地址,类文件的格式是$class.class.php
        $classPath = str_replace(‘\\‘,‘/‘,__DIR__).‘/‘.$class.‘.class.php‘;
        //var_dump($classPath);
        if(file_exists($classPath)){
            include_once $classPath;
        }
    }
    //注册自动加载函数,此时autoload这个函数就相当于php的自动寻找类函数__autoload()
    spl_autoload_register(‘autoload‘);
    $obj = new auto;//这个类已经存在同级目录中,我的情况
    $obj->autoloader();

    /*spl_autoload_register假如用在类中,则传递的参数必须包含类名和方法名
    *如下面的例子:
    */
    class loadClass{
        public function loadFunction($class){
            $classPath = str_replace(‘\\‘,‘/‘,__DIR__).‘/‘.$class.‘.class.php‘;
            if(file_exists($classPath)){
                include_once $classPath;
            }
        }
        public function _register(){
        //注册自动加载方法loadFunction
        spl_autoload_register(‘self::loadFunction‘);
        //或者参数为数组,数组的第一个元素为类名,第二个为要注册的方法名
        spl_autoload_register(array(‘loadClass‘,‘loadFunction‘));
        }
    }

对于参数的个人经验:

关于这个函数的参数,它困扰了我一个小时,你想想,spl_autoload_register()注册的函数,它是个自动加载函数,我们是没必要直接调用它的,它会自动加载到栈区中,不能直接调用,也就是说,我们无需调用上面的autoload(),也就根本没办法给它传参数了,那么这个参数会从哪里来呢?这个在我刚刚认识spl_autoload_register()时,确实让我苦恼了一会,不过,我做了一下实验,发现这个参数确实无须传递,它自己会以你调用的类名传递过去,你实例化什么类,他就传递什么类名,就是这么智能。说到这里,感叹spl_autoload_register注册的函数厉害不?呵呵,不信,你可以做一下实验

 

时间: 2024-10-17 04:43:32

php的spl_autoload_register函数的一点个人见解的相关文章

PHP中spl_autoload_register函数的用法

spl_autoload_register (PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中.因为 spl_autoload

自动加载类PHP中spl_autoload_register函数的用法

spl_autoload_register(PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明bool spl_autoload_register ([ callback $autoload_function ] )将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中.因为 spl_autoload_

STL中容器的push()或者push_back()函数的一点说明

在STL的queue 或者 vector.list等容器适配器或者容器中,会经常用到的函数就是push()或者push_back()函数,但是有一点需要明确的是: 在使用这些函数对容器/适配器对象增加新元素的时候,实际上是对原有的元素对象复制重新新建了一个元素对象作为元素压入到容器/适配器对象中. 例如: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include<queue> #include<iostream> u

php spl_autoload_register() 函数

spl_autoload_register()的用法: 其中$this表示当前类,autoload()是我注册的自动加载函数,当然这个只是一个函数名,只要不与php的关键字重复,符合一般函数名的命名规范即可. 使用自动加载之后,当我们在一个类中需要加载很多个其它类文件时,不用频繁使用require()函数,这样代码看起来更加规范,至于性能上是否有很大提升这个需要研究一下php的内核. php是靠zend 引擎解析程序的,zend引擎中存在SPL__autoload栈,当你使用spl_autolo

使用mysql函数 group_concat 一点需要注意的

这个函数是一个非常好用的函数,比如我们可以在 进行多对多关联表,进行批量查询的时候可以用到, 比如学生和老师是多对多的关系,如果我们希望查询 指定的一些老师对应的学生有哪些 的时候,一般的情况,我们可能会遍历teacher_id,来一个个获取对应的学生集合,这样的话,效率是很差的,但是有了group_concat函数,你可以不用这样,你可以使用如下方式进行获取 select teacher_id,group_concat(student_id) from teache_student_mappi

PHP 中的__autoload() 与spl_autoload_register()函数

__autoload()函数可以实现自动加载所需要的类 用法: __autoload() 在实例化对象时,若没有引入相关的文件,就会自动调用这个方法来进行加载. 实例: public function __autoload($className) {     $actionPath ="E://project/LiB/Action/".$className.".class.php":     if(!file_exists($actionPath))     {  

对JS回调函数的一点理解

之前写的异步JS是纯译文,现在刚好工作了2个月,想谈谈我自己对JS回调函数的一点理解,欢迎渴望大家的指正和交流. 回调函数从形式上看就是把函数b作为参数传给函数a,在a的函数体里调用函数b 1 function a(b) { 2 b(); 3 } 4 function b() { 5 ... 6 } 这样做的意义是什么呢 1.控制执行流程,函数b只能在函数a执行后才执行 2.根据不同的需求,可以有各种各样的函数b 3.最重要的,是可以把通过函数a获取的数据传递给函数b 1 function a(

PHP spl_autoload_register()函数的一些见解

由于公司网络完全禁掉了一切可以翻墙的可能(中国电信内部).无奈只能使用百度查spl_autoload_register()一些详细信息,因为该函数在手册上面说是可以注册多个__autoload(),而且可以都能作用. 我很好奇这个是怎么做到的,毕竟__autoload()就只能注册一种机制,为何spl_autoload_register()就可以使用多种机制了呢?(我以后再也不会使用百度来浪费我的时间了!) 感谢stackoverflow上面的Sep网友:http://stackoverflow

PHP中spl_autoload_register()函数

spl_autoload_register — 注册给定的函数作为 __autoload 的实现 官方地址:http://php.net/manual/zh/function.spl-autoload-register.php 我的测试 定义三个文件test.php test1.php test2.php test.php <?php spl_autoload_register('autoLoad1'); test1::test();echo "<br/>"; tes