我设置了一个简单的自动加载,以了解与命名空间一起工作时的原理。
test.php:
namespace House;
function __autoload($classname)
{
$parts = explode('''', $classname);
$class = 'Room/'.end($parts).'.php';
require_once($class);
}
$Toy = new Toy();
echo $Toy->hello();
Room/Toy.php:
namespace House;
class Toy
{
public function hello() { return "HELLO"; }
}
当声明$Toy时,我得到致命错误:在第18行的test.php中找不到类"House''Toy"
我在这里没有做错什么?
当删除__autoload功能而只放入时
require_once('Room/Toy.php');
它有效!
您的test.php
应该如下所示:
use House'Toy as Toy;
function __autoload($classname)
{
$parts = explode('''', $classname);
$class = 'Room/'.end($parts).'.php';
require_once($class);
}
$Toy = new Toy();
echo $Toy->hello();
如果将namespace House
放在文件的顶部,则该文件中声明的所有函数都将属于名称空间House
。意味着__autoload()
得到了House'__autoload()
,并将失去它的魔法意义。
另外,将名称空间House
的文件存储在名为House
的文件夹中不是更好吗?(您当前使用的是Room
)。如果你这样做,__autoload()
函数可以写得更通用:
function __autoload($classname)
{
$parts = explode('''', $classname);
$path = implode('/', $parts) . '.php';
require_once($path);
}
尝试使用此自动加载器:)并将目录Room的绝对路径添加到包含路径中。Inside Room有另一个名为House的目录,Toy.php将位于其中。
<?php
spl_autoload_register ( function ( $className, $fileExtensions = null ) {
$className = str_replace ( '_', '/', $className );
$className = str_replace ( '''', '/', $className );
$file = stream_resolve_include_path ( $className . '.php' );
if ( $file !== false ) {
include $file;
return true;
}
return false;
});