我已经设置了一个简单的自动加载来理解与命名空间一起使用时的原则。
test.php的:
namespace House;
function __autoload($classname)
{
$parts = explode('\\', $classname);
$class = 'Room/'.end($parts).'.php';
require_once($class);
}
$Toy = new Toy();
echo $Toy->hello();
房/ Toy.php:
namespace House;
class Toy
{
public function hello() { return "HELLO"; }
}
当宣布$ Toy时,我得到致命错误:Class' House \ Toy'在第18行的test.php中找不到
我在这里有什么不对吗?
删除__autoload功能时,只需输入
即可require_once('Room/Toy.php');
有效!
答案 0 :(得分:1)
您的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);
}
答案 1 :(得分:0)
尝试使用此自动加载器:)并将目录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;
});