zoukankan      html  css  js  c++  java
  • spl_autoload_register() 函数实现的自动加载

    和Python用module来区分代码块不同,PHP按照命名空间来区分,开始学PHP的时候一心认定了如果想用 use 关键字来导入(Python的习惯说法)一个类或者函数或者其他对象的话,必须先include该对象所在的文件,或者require该文件.相当于是把该文件代码加载到内存代码块中,从而能够搜索代码块并使用.

    但是看了thinkPHP框架和guthub上一些项目后发现他们的代码挺潇洒的,居然不用include/require.这让我对自己的认识产生了质疑...

    少废话了,自动加载使用的是PHP的

    spl_autoload_register

    函数,该函数的作用是用于注册一些搜索规则*

    当代码需要引用某些变量,类等的时候,如果当前内存代码块中没有,那么就会从这些注册的规则中取挨个的套用匹配,直到找不到,然后报错.

    函数使用方式:

    spl_autoload_register(function, throw, prepend)  // throw 全都找不到是否抛错 prepend 是否将规则加在队列最前面(如果你的规则十分个性独特,就可以放在最前面)

    也可以用匿名函数的方式:

    <?php
    
    namespace spa;
    
    spl_autoload_register(function ($class) {
        echo "wanted " . $class . "
    ";
        if ($class == "spaSpace") {
            $class = "Space.php";
        } elseif ($class == "spaEle") {
            $class = __DIR__."/../learn_php/Ele.php";
        }
        include_once $class;
    });

    通过测试发现,每次需要执行本文件本命名空间不存在的代码块的时候,都会执行一遍如上注册的函数,然后echo出的信息,当然项目框架最好是按照严格的命名规范来,这样也容易写出匹配规则,然后把该函数在项目的必经之路上执行一遍,就可以和那些潇洒的代码一样,直接 use ,不用include/require 文件了.

    *注意:

    注册规则的代码一定要最先执行,或者至少要在你本应当执行include/require之前被执行.

  • 相关阅读:
    修改MyEclipse8.5的workspaces
    Wamp设置虚拟目录
    WPF实现无刷新动态切换多语言(国际化)
    WPF的ComboBox简单用法
    particles.js在vue上的运用
    Vue项目中的RSA加解密
    【转】VUE 爬坑之旅-- 如何对公共JS,CSS进行统一管理,全局调用
    linux安装成功后怎么调出终端
    第一个shell脚本
    背景图片固定不随页面上下滚动而滚动 ,属性 background-attachment
  • 原文地址:https://www.cnblogs.com/haiton/p/12073333.html
Copyright © 2011-2022 走看看