这是我的网络结构,例如,PHP spl_autoload_register导致类重复?
index.php
'core/model/'
'core/helper/'
'core/ext/'
我有model
文件夹下这些类文件,
MyClass.php
MyClass2.php
classfour.php
而且我想通过自动加载类自动加载它们,
define ('WEBSITE_DOCROOT', str_replace('\\', '/', dirname(__FILE__)).'/');
function autoloadMultipleDirectory($class_name)
{
// List all the class directories in the array.
$main_directories = array(
'core/model/',
'core/helper/',
'core/ext/'
);
$sub_directories = array();
$parts = explode('\\', $class_name);
$file_name = end($parts).'.php';
foreach($main_directories as $path_directory)
{
$iterator = new RecursiveIteratorIterator
(
new RecursiveDirectoryIterator(WEBSITE_DOCROOT.$path_directory), // Must use absolute path to get the files when ajax is used.
RecursiveIteratorIterator::SELF_FIRST
);
foreach ($iterator as $fileObject)
{
if ($fileObject->isDir())
{
$sub_directories[] = preg_replace('~.*?(?=core|local)~i', '', str_replace('\\', '/', $fileObject->getPathname())) .'/';
}
}
}
// Mearge the main dirs with any sub dirs in them.
$merged_directories = array_merge($main_directories,$sub_directories);
print_r($merged_directories);
// Loop the merge array and include the classes in them.
foreach($merged_directories as $path_directory)
{
if(file_exists(WEBSITE_DOCROOT.$path_directory.$file_name))
{
include WEBSITE_DOCROOT.$path_directory.$file_name;
}
}
}
Implementations,
spl_autoload_register('autoloadMultipleDirectory');
//define classone
class classone { }
//define classtwo
class classtwo { }
//define classthree
class classthree { }
print_r(get_declared_classes());
结果,
Array
(
[0] => stdClass
...
[131] => tidyNode
[132] => classone
[133] => classtwo
[134] => classthree
)
但classfour
,MyClass
& MyClass2
不在列表中。
和,
$test = new MyClass();
$test2 = new MyClass2();
$test3 = new classfour();
将导致该重复取决于我有多少类实例化,
Array
(
[0] => core/model/
[1] => core/helper/
[2] => core/ext/
)
Array
(
[0] => core/model/
[1] => core/helper/
[2] => core/ext/
)
Array
(
[0] => core/model/
[1] => core/helper/
[2] => core/ext/
)
在我的直播服务器
我得到更奇怪的结果,
Array
(
[0] => core/model/
[1] => core/helper/
[2] => core/ext/
[3] => core/model/./ (duplicated)
[4] => core/model/../ (duplicated)
[5] => core/helper/./ (duplicated)
[6] => core/helper/../ (duplicated)
[7] => core/ext/./ (duplicated)
[8] => core/ext/../ (duplicated)
)
任何想法为什么以及如何修复它?
编辑:
如果我有手工类,
include 'core/model/MyClass.php';
include 'core/model/MyClass2.php';
include 'core/model/classfour.php';
print_r(get_declared_classes());
$test = new MyClass();
$test2 = new MyClass2();
$test3 = new classfour();
我得到正确的答案,
Array
(
[0] => stdClass
...
[131] => tidyNode
[132] => classone
[133] => classtwo
[134] => classthree
[135] => MyClass
[136] => MyClass2
[137] => classfour
)
classfour
,MyClass
& MyClass2
现在在列表中。
怎么回事?
我看到三个不同的'print_r()'输出。这是可以解释的:这是因为自动加载函数被调用了三次。我没有看到“重复”问题。什么被重复和在哪里? – geomagas
请看我上面的编辑。谢谢。 – laukok
'我看到三个不同的print_r()输出。“其他两个在哪里?我只在自动载入类中使用'print' ONCE。 – laukok