自动加载类的另一种方式实现问题
程序员文章站
2022-04-19 13:07:58
...
hello,看了手册上关于自动加载的另一种更快速的方式后,动手试了下,发现挺好用的。不过碰到了个小问题,就是当new class()的那个文件和包含类的文件夹不是属于同级的时候不知道如何自动加载了。
index.php:
index.php:
namespace inc;
spl_autoload_extensions('.class.php');
spl_autoload_register();
new a();
inc\a.class.php:
namespace inc;
class a{
function __construct(){
echo 'a';
}
}
上面这样是可以输出a的,但是当把index.php放到比如index\index.php的时候就没法加载类了。请教下这种情况下有没有好的解决办法。
补充下,自己写加载程序可以,但是比较喜欢那老外的方法,2个函数就让php自动完成加载,不需要写额外的代码,好神奇。
回复内容:
hello,看了手册上关于自动加载的另一种更快速的方式后,动手试了下,发现挺好用的。不过碰到了个小问题,就是当new class()的那个文件和包含类的文件夹不是属于同级的时候不知道如何自动加载了。
index.php:
namespace inc;
spl_autoload_extensions('.class.php');
spl_autoload_register();
new a();
inc\a.class.php:
namespace inc;
class a{
function __construct(){
echo 'a';
}
}
上面这样是可以输出a的,但是当把index.php放到比如index\index.php的时候就没法加载类了。请教下这种情况下有没有好的解决办法。
补充下,自己写加载程序可以,但是比较喜欢那老外的方法,2个函数就让php自动完成加载,不需要写额外的代码,好神奇。
推荐使用Composer
进行自动加载, PSR-0规范.
这个加载方式在Zend中早已被内化,例如一个在Vendor/MyClass.php中的类,可以用Vendor_MyClass来调用。
怎么区分文件夹,这是需要自己写程序实现的。如下代码:
function _vendor_autoload($class) {
$parts = explode('\\', $class);
# Support for non-namespaced classes.
$parts[] = str_replace('_', DIRECTORY_SEPARATOR, array_pop($parts));
$path = implode(DIRECTORY_SEPARATOR, $parts);
$file = stream_resolve_include_path($path.'.php');
if($file !== false) {
require $file;
}
}
spl_autoload_register('_vendor_autoload');