PHP类自动加载spl_autoload_register()

在PHP有两种方式实现类的自动加载:__autoload()和spl_autoload_register()。但由于__autoload()是我们自己定义的函数,它只允许被定义一次,这样很容易导致冲突,显得很不灵活,php 7已经把__autoload()废弃。spl_autoload_register()是spl标准库提供的函数,它允许我们多次调用,根据需要加载多个不同的autoloader。

示例:

<?php
spl_autoload_register('myAutoloader');

function myAutoloader($className)
{
    $path = '/path/to/class';

    include $path.$className.'.php';
}
$myClass = new MyClass();
?>

spl_autoload_register()函数注册了我们自定义的自动加载器myAutoloader。当我们声明的类,如MyClass找不到时,它会在注册的自动加载器里,根据加载器定义的规则加载文件。myAutoloader是一个函数,它接收类名作为参数,它会在指定的路径下加载$className.php文件。

注册多个类自动加载器

spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');

class MyAutoloader
{
    public static function ClassLoader($className)
    {
         //加载类的逻辑代码
    }

    public static function LibraryLoader($className)
    {
         //加载类的逻辑代码
    }

    public static function HelperLoader($className)
    {
         //加载类的逻辑代码
    }


    public static function DatabaseLoader($className)
    {
         //加载类的逻辑代码
    }
}

配置spl_autoload_register()

如果我们加载的类在同一个目录下,我们可以直接调用spl_autoload_register(),不需要指定类加载器。

set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();
  • set_include_path:设置类的根路径
  • spl_autoload_extensions:指定加载文件的后缀

版权声明:著作权归作者所有。

相关推荐

纯JavaScript检测页面是否加载完成(理解JavaScript页面加载事件)

JavaScript与页面加载相关的事件先介绍JavaScript与页面加载相关的几个事件:document.readystatechangereadystatechage事件会监控document.readyState。readyState有三个值:loading:文档正在加载interactive:文档已加载完成且已被解析,但子资源(如image,css,iframe等)仍在加载。comple

Gradle自动签名release的apk

Gradle的任务可以帮我们自动完成很多重复的工作,这里介绍下如何自动对发布的apk进行签名。signing.gradle在app目录下新建signing.gradle文件,文件名可以根据需要修改。signing.gradle内容如下:ext.signing = [         storeFil

PHP递归删除多级目录

php删除文件夹需要结合三个函数:glob:用于遍历文件unlink:删除文件rmdir:删除空文件夹<?php  public static function recursiveDelete($dir) {      $dir = rtrim($dir,'/');     

基于RxJava和Kotlin封装类处理网络加载数据

在Android开发里,常常需要处理网络加载数据,这里基于RxJava,和Kotlin的Sealed class(封装类)的特性实现的一个示例。Resource.kt首先使用Kotlin的sealed class实现Resource.kt,它用来包装数据和状态。sealed class Resource<out T> { &n

Kotlin:类的定义

基本定义Kotlin使用关键词class定义类,如:class User { } 声明类主要包括三部分:类名:必选,类的名称,一般以大写字母开头。类头:可选,类头包括type parameter(如泛型),主构造(primary constructor)等。类体:可选,在Kotlin,类体是可选的,它有大括号{}括起来。类头和类体是可选的,一个最简单的类可