专业的编程技术博客社区

网站首页 > 博客文章 正文

29、php类加载器实现(php类自动加载)

baijin 2024-09-12 11:21:44 博客文章 8 ℃ 0 评论

1、类加载器实现

  • 函数spl_autoload_register

注册给定的函数作为 __autoload 的实现

  • 函数原型

spl_autoload_register($callBack,$throw=true,$prepend=true)

2、案例1

  • 目录名称

/data/api/study/3、相关知识点

  • 文件名8、类加载器.php 其源码如下

<?php

/**

* Copyright(C) Iamasb

* @project : 3、workerman相关知识点

* @explain : 类加载器

* @filename : 8、类加载器.php

* @author : Iamasb

*/

class Load

{

/**

* 文件格式常量

*/

const PREFIX = ".php";

/**

* 处理类文件加载的核心方法

* @param $className

* @return bool

*/

public static function toDo($className)

{

echo $className,PHP_EOL;

exit;

}

}

spl_autoload_register('Load::toDo');

// 测试代码

$test = new TestClass();

  • 执行结果
  • 总结

从这个例子中,可以看出,当注册类加载器后,在当前文件中实例化任何类时,都会触发类加载器的方法。并获取类名。也就是说,如果我们知道类所在的目录位置,那么我们就可以"包含"此类的代码信息,到当前的执行环境里面了

3、案例2

  • 新增类文件TestClass.php,其源码如下:

<?php

/**

* Copyright(C) Iamasb

* @project : 3、workerman相关知识点

* @explain : 类加载器,被加载的测试类

* @filename : TestClass.php

* @author : Iamasb

*/

class TestClass

{

public function func()

{

echo 'hello world',PHP_EOL;

}

}

  • 修改类加载器的回调方法

public static function toDo($className)

{

// echo $className,PHP_EOL;

// exit;

$file = __DIR__.DIRECTORY_SEPARATOR.$className.self::PREFIX;

if (!file_exists($file)) {

die($className." is not exits.");

}

if (!class_exists($className,false)) {

include_once $file;

}

return true;

}

  • 再修改测试代码

$test = new TestClass();

$test->func();

  • 再次执行

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表