问题是自动加载多个文件包含未加载 不使用spl_autoload_register()的自动加载直接加载函数是否正确?
文件:
-class(folder)
--cls.php (file)
--db.cls.php(file)
--config.cls.php(file)
-index.php(file)
mp3.cls.php
档案:cls.php
<?php
class dosya
{
static function yukle($a)
{ $d=__DIR__.DIRECTORY_SEPARATOR.str_replace('\\','/',$a).".cls.php";
if(file_exists($d))
{
include_once($d);
}
else{
return self::yukle($a);
die($a." sınıfı bulunamadı :(");
}
}
}
?>
文件:mp3.cls.php
<?php
include_once("cls.php");
dosya::yukle("config");
dosya::yukle("db");
class mp3 extends db {}
?>
file:config.cls.php
<?php
include_once("cls.php");
dosya::yukle("db");
class config extends db {}
?>
file:db.cls.php
<?php include_once("cls.php");
class db {}
?>
的index.php
<?php
include_once("mp3.cls.php");
$b=new mp3();
?>
答案 0 :(得分:0)
我会忽略这样一个事实,即你忽略了命名约定和自动加载器的PSR标准。但有一件事我觉得有必要指出的是:(这是你的确切代码,但其格式合理)
class dosya
{
static function yukle($a)
{
$d=__DIR__.DIRECTORY_SEPARATOR.str_replace('\\','/',$a).".cls.php";
if(file_exists($d)){
include_once($d);
}else{
return self::yukle($a); //this is recursive, and as you dont modify $a, it's infinate
die($a." sınıfı bulunamadı :("); //this code is never executed.
}
}
}
如果您说尝试加载名为foo
的类。你的自动加载器会选择它,把它变成这样的东西
$b = '/home/public_html/foo.cls.php'
这一切都很好,但是一旦你的if条件失败,因为该文件不存在if(file_exists($d)) = false
。条件的else部分运行return self::yukle($a);
,您可以在其中重新调用自动加载程序函数yukle($a)
。现在,关键是你根本不改变$a
。所以它只会重复上面的内容(分配$ b,无法检查文件)然后再次调用自身,然后再次重复。这将无限发生,或直到您的应用程序达到PHP的max_execution_time限制。
我强烈建议你不要这样做。
干杯!