我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

spl_autoload_register()函数中,苏南大叔有提到:具体的load逻辑实现,就是仁者见仁智者见智的事情了。那么,本文中,苏南大叔就提供一些可能的备选方案。具体来说,就是关于:spl_autoload_register()的第一个参数autoload_function的具体理解。

苏南大叔:php如何实现spl_autoload_register具体load逻辑 - php-script
php如何实现spl_autoload_register具体load逻辑(图5-1)

方案大全预览

这里先说个下述方案的前提:
MyNamespace命名空间下的MyClass类文件,存在的位置是:mynamespace/myclass.php

在不同的系统下,文件名称的大小写问题处理是不一样的,所以,文件名大小写问题,一定要注意,否则就会出现很多莫名其妙的问题。比如:mac系统和win系统,大小写就是不敏感的。而centos系统就是大小写敏感的。

如果不考虑去文件名路径的问题,下面列出了五种函数,来实现这个具体的自动加载的逻辑。注意:这五种函数任选其一即可。

spl_autoload_register(function ($class) {
    echo("如下五种方式,任选一种即可:" . $class . "<br/>");
    spl_autoload($class);
    $file = str_replace("\\", "/", strtolower($class));
    $file .= ".php";
    include($file);
    require($file);
    include_once($file);
    require_once($file);
});
$test = new \MyNamespace\MyClass();

苏南大叔:php如何实现spl_autoload_register具体load逻辑 - autoload_all
php如何实现spl_autoload_register具体load逻辑(图5-2)

spl_autoload

第一种方案使用spl_autoload()函数。

  • 这个函数的要求是:路径必须全部小写。
  • spl_autoload()的默认加载逻辑是:把$class转为小写,然后叠加.php或者.inc后缀。
  • 如果默认文件后缀不是.php或者.inc这两种情况的话,请在第二个参数中主动说明。
  • http://doc.php.sh/zh/function.spl-autoload.html
spl_autoload_register(function ($class) {
    echo("如下五种方式,任选一种即可:" . $class . "<br/>");
    // 如果路径是全部小写的,就可以使用spl_autoload
    spl_autoload($class);
    // 默认是加载的文件名是".php"或者“.inc”
    // 如果是其他的扩展名,请传递第二个参数
    // spl_autoload($class,".phpx");
});
$test = new \MyNamespace\MyClass();

苏南大叔:php如何实现spl_autoload_register具体load逻辑 - autoload_spl
php如何实现spl_autoload_register具体load逻辑(图5-3)

require vs include

如果您的文件路径不是纯正的小写字符的组成路径的话,就可以使用require或者include了。为了演示方便,下面叙述的方案中,仍然会把$class进行路径小写转化。实际上,使用require或者include的时候,strtolower()并不是必须的。

这里实际上涉及到了一个经典的php笔试题目:requireinclude到底有什么区别?两者基本上是一致的效果。但是,当目标文件不存在的时候,两者就有不同的表现了。具体体现在:

newsn.net:这里是【评论】可见内容

苏南大叔:php如何实现spl_autoload_register具体load逻辑 - autoload_include
php如何实现spl_autoload_register具体load逻辑(图5-4)

苏南大叔:php如何实现spl_autoload_register具体load逻辑 - autoload_require
php如何实现spl_autoload_register具体load逻辑(图5-5)

require vs require_once

对于_once与不带_once的区别,这个requireinclude的原理上,是一致的。带_once的函数,并不会重复加载相关的文件,可以避免定义已经存在的的相关错误提示。

下面是相关具体描述:

但是对于autoload_function这事来说,如果执行到require或者include这一步骤了。那么肯定是没有加载过相关文件的,否则也不会执行到需要autoload,对吧?所以,在这个意义上来说,带不带_once效果都会是一致的。

文件命名逻辑

关于类文件的命名及路径,这个就是不同的框架有不同的定义了。这个就不做强制规定了。不过,要求路径和命名空间相对应,文件名和类名相对应。这样才好进行autoload对吧。需要特别注意的是:类名中的分隔符是和路径中的分隔符是不一致的,需要在脚本里面,主动做个替换,比较好一些。

str_replace("\\", "/", strtolower($class));

相关文章

结论

本篇文章设计的问题,因为答案太多,所以就没有明确的结论了。大家根据自己的实际情况写这个函数功能就可以了。更多相关文章,点击下面的链接,查看吧。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    autoload