php怎么实现类的自动注册

2021-07-23  本文已影响0人  张清柏

命名空间

报错信息PHP Fatal error: Cannot redeclare test() (previously declared in /Users/zhangguofu/website/default/IMooc/Test/Test1.php:9) in /Users/zhangguofu/website/default/IMooc/Test/Test2.php on line 12

Test1文件已经声明了test方法,Test2就不能声明了

image.png

那我们吧命名空间给加上去,看看怎么样,发现执行成功了,而在每个调用test函数前,都加上了各自的命名空间。这就是命名空间的作用


image.png image.png
guofu@guofu:/home/wwwroot/default/Example$ /usr/local/php5.6/bin/php demo_class.php
Test\Test1\T_Class
PHP Fatal error:  Class 'Test\Test1\T_Class' not found in /home/wwwroot/default/Example/demo_class.php on line 9
image.png

下面我们来执行一下

guofu@guofu:/home/wwwroot/default/Example$ /usr/local/php5.6/bin/php demo_class.php
Test\T_Class::t1
Test\T2_Class::t1
guofu@guofu:/home/wwwroot/default/Example$ 

它有以下优点

  1. 使用类的时候不需要手动去include或者require
    2.由于这种lazy loading ,避免了require多余的文件
    3.无需考虑到文件的实际地址,我们根据命名空间就可以实现文件载入。
<?php
/**
 * Notes:
 * User: zhangguofu
 * Date: 2021/7/23
 * Time: 下午6:24
 * Class ${NAME}
 */

//注意,这个自动加载应该放在类的调用前面
spl_autoload_register(function ($class){
    require_once (str_replace("\\","/",__DIR__."/".$class.".php"));
});
\Test\T_Class::t1();
echo PHP_EOL;
\Test\T2_Class::t1();

有好奇心的同学可能会问spl_autoload_register 是怎么实现的呢?
spl_autoload_register 函数的功能就是把传入的函数(参数可以为回调函数或函数名称形式)注册到 SPL __autoload 函数队列中,并移除系统默认的 __autoload() 函数。

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

上一篇 下一篇

猜你喜欢

热点阅读