💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
| 关于PHP中命名空间和spl\_autoload\_register函数的关系说明 | | | --- | --- | 在我们使用命名空间的时候,只完成了一种逻辑关系的独立。意思也就是说,对于PHP引擎来说,当他看到 namespace myclass;的时候,可以知道,此名称以下定义的类库拥有了一个独立的空间,名字叫做 myclass 。而同样的类库名称不能在同一个明明空间中,意思类似于,同一个文件夹下,不能创建相同名称的两个文件。 但是我们如果定义了不同的命名空间和类库,然后想要正常的在一个命名空间的类库中调用另一个命名空间的类库,即使使用了use 这个关键字,我们会发现,系统依然调用不到相应的类库。这就好像,我们在C盘放了一个文件,D盘放了一个文件,然后他们是独立的,可是我想在C盘的文件中调用D盘的文件,只有一个名字是不可能调用的到的。我们只是new 了一个类库,但是系统是找不到这个类库在哪里的,所以我们需要手动去引入D盘的文件到C盘的文件中,才能互相使用。但是当我们系统中有几百个类库的时候,手动一条条引用,显然是不现实的,那么我们就需要一个按着需求自动引入类库的机制。而要完成这样一个机制,我们就要用到spl_autoload_register函数 [TOC] 个人见解 命名空间配上use 的作用是方便实例化类的时候不需要写类的路径,然后再配合自动加载spl_autoload_register函数的时候,把类的引用路径 + 类名传递给自动加载函数,然后再通过自动加载函数进行加载这些类,然后实例化类的时候就可以直接new class_name() [TOC] 实例 方法一 ``` <?php namespace core; class Autoloader { const NAMESPACE_PREFIX = 'core\\'; public static function register() { spl_autoload_register(array(new self, 'autoload')); } public static function autoload($class_name) { $namespace_len = strlen(self::NAMESPACE_PREFIX); if (strncmp(self::NAMESPACE_PREFIX, $class_name, $namespace_len) === 0) { // $class_name = strtolower($class_name); $file_path = str_replace('\\', DIRECTORY_SEPARATOR, substr($class_name, $namespace_len)); $file_path = realpath(__DIR__ . (empty($file_path) ? '' : DIRECTORY_SEPARATOR) . $file_path . '.php'); if (file_exists($file_path)) { require_once $file_path; }else { return false; } } } } AutoLoader::register(); ``` 注释:spl_autoload_register(array(new self, 'autoload'));这里是直接实例化本身这个类,再调用autoload这个方法,第一个参数可以是一个数组,这是其中一种方式,第二个参数参数设置了 autoload\_function 无法成功注册时, spl\_autoload\_register()是否抛出异常,第三个参数如果是 true,spl\_autoload\_register() 会添加函数到队列之首,而不是队列尾部 [TOC] 方法二 ``` spl_autoload_register('myAutoLoad', true, true); //这里是使用这个函数的第二种方法,直接调用的一个函数来实现自动加载的功能 ``` [TOC] 方法三 ``` spl_autoload_register(function ($className) { echo "所有的包含文件工作都交给我!\\r\\n"; $classFileName = "./{$className}.php"; echo "我来包含!{$classFileName}\\r\\n"; include "./{$className}.php"; }, true, true); ``` 注释:这里使用的函数闭包的方式来处理