zoukankan      html  css  js  c++  java
  • SPL--spl_autoload_register

    spl_autoload_register() :

    调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是调用__autoload函数。

    解决问题

    函数__autoload($classname)可以做到动态的加载类,可以避免使用require_once语句,但如果拥有一个大规模的应用程序,其中包含了库或者较小的应用程序,那么每个应用程序可能都希望声明一个__autoload函数去查找他的文件。问题在于,在全局范围内声明两个__autoload()函数会产生重复声明的错误。

    Usage:

    spl函数接受3个参数:[ 添加到自动加载栈的函数, 加载器不能找到这个类时是否抛出异常的标志 = true,注册到队首而不是队尾 = false ]

    第一个参数可选,默认指向spl_autoload(),这个函数会自动在路径中查找具有小写类名和.php或.ini扩展名的文件,或注册到spl_autoload_extensions()函数的其他扩展名。

    <?php
    
    define('CLASS_DIR', 'class/')
    /*
     * set_include_path 设置php包含文件的路径
     * get_include_path  获取当前php包含文件的路径,默认.:/usr/share/pear:/usr/share/php   //linux以:分割,win以;分割
     * PATH_SEPARATOR    常量,代表当前系统的分隔符
     */
    
    set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR); //扩展php包含文件的路径
    
    //注册并返回spl_autoload函数使用的默认文件扩展名,本函数用来修改和检查 __autoload() 函数内置的默认实现函数 spl_autoload() 所使用的扩展名,默认的spl_autoload函数使用的扩展名是".inc,.php"。 
    //spl_autoload_extensions('.class.php,inc,interface,.class');   //注册多个 
    spl_autoload_extensions('.class.php');
    
    // 用默认方法
    //spl_autoload_register(); //默认调用,默认抛出异常
    spl_autoload_register(null, false);  //用默认函数,未找到类时不抛出异常
    spl_autoload_register('myLoader1', false);
    spl_autoload_register('myLoader2', false);
    
    
    //实例化类时,spl_autoload()先在包含路径中查找,这里的class/test.class.php存在,将会被include,如果不存在,将会调用myLoader1,2自定义函数,如果还是没找到,抛出一个没有被正确声明类异常。
    $instance = new Test(); 

     

    安全调用:

    一旦调用了spl_autoload_register(), 程序中的__autoload()函数就不回被调用了,如果想保留__autoload()的功能,把其注册为自动加载栈中的第一个函数:

    if( false === spl_autoload_function() ){
        if( function_exists('__autoload') ){
            spl_autoload_register('__autoload', false);
        }
    }

    spl_autoload_function() : 返回已注册函数的数组,如果spl自动加载栈还没有初始化,返回false。

  • 相关阅读:
    【杂谈】对RMI(Remote Method Invoke)的认识
    【杂谈】对CopyOnWriteArrayList的认识
    【杂谈】Java I/O的底层实现
    揭开Future的神秘面纱——结果获取
    揭开Future的神秘面纱——任务执行
    【详解】ThreadPoolExecutor源码阅读(三)
    【详解】ThreadPoolExecutor源码阅读(二)
    【详解】ThreadPoolExecutor源码阅读(一)
    小程序页面数据回传
    记录一个吃过前端内存的坑
  • 原文地址:https://www.cnblogs.com/leezhxing/p/4244324.html
Copyright © 2011-2022 走看看