php如何实现spl_autoload_register具体load逻辑
发布于 作者:苏南大叔 来源:程序如此灵动~在spl_autoload_register()
函数中,苏南大叔有提到:具体的load逻辑实现,就是仁者见仁智者见智的事情了。那么,本文中,苏南大叔就提供一些可能的备选方案。具体来说,就是关于:spl_autoload_register()
的第一个参数autoload_function
的具体理解。
方案大全预览
这里先说个下述方案的前提: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();
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();
require
vs include
如果您的文件路径不是纯正的小写字符的组成路径的话,就可以使用require
或者include
了。为了演示方便,下面叙述的方案中,仍然会把$class
进行路径小写转化。实际上,使用require
或者include
的时候,strtolower()
并不是必须的。
这里实际上涉及到了一个经典的php笔试题目:require
和include
到底有什么区别?两者基本上是一致的效果。但是,当目标文件不存在的时候,两者就有不同的表现了。具体体现在:
require
vs require_once
对于_once
与不带_once
的区别,这个require
和include
的原理上,是一致的。带_once
的函数,并不会重复加载相关的文件,可以避免定义已经存在的
的相关错误提示。
下面是相关具体描述:
- http://doc.php.sh/zh/function.require.html
- http://doc.php.sh/zh/function.require-once.html
- http://doc.php.sh/zh/function.include.html
- http://doc.php.sh/zh/function.include-once.html
但是对于autoload_function
这事来说,如果执行到require
或者include
这一步骤了。那么肯定是没有加载过相关文件的,否则也不会执行到需要autoload
,对吧?所以,在这个意义上来说,带不带_once
效果都会是一致的。
文件命名逻辑
关于类文件的命名及路径,这个就是不同的框架有不同的定义了。这个就不做强制规定了。不过,要求路径和命名空间相对应,文件名和类名相对应。这样才好进行autoload
对吧。需要特别注意的是:类名中的分隔符是和路径中的分隔符是不一致的,需要在脚本里面,主动做个替换,比较好一些。
str_replace("\\", "/", strtolower($class));
相关文章
结论
本篇文章设计的问题,因为答案太多,所以就没有明确的结论了。大家根据自己的实际情况写这个函数功能就可以了。更多相关文章,点击下面的链接,查看吧。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。