报错信息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就不能声明了
那我们吧命名空间给加上去,看看怎么样,发现执行成功了,而在每个调用test函数前,都加上了各自的命名空间。这就是命名空间的作用
但是我们也发现一个问题,每当要使用某个文件里面的方法,都必须要require一次,很麻烦,于是我们就发明了一个函数 __autoload
,实现类的自动载入,当一个类被用到而没有被载入的话,这个函数就会试图载入这个类文件,举个栗子看一下。
我们使用autoload(该函数在7.2以后已经被弃用) 函数加载类
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
下面我们来执行一下
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$
它有以下优点
但是这样会有一个问题,我们知道function __autoload($class)
它是一个函数,那么这种函数, autoload () 是全局函数只能定义一次,不够灵活,所以所有的类名与文件名对应的逻辑规则都要在一个函数里面实现,造成这个函数的臃肿。,就没法实现了,怎么办呢?在php5.3以后spl_autoload_register() 满足了此类需求。我们来看一下效果
或者使用匿名函数
<?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() 函数。