PHP - 命名空间和自动加载问题

时间:2015-04-07 08:33:17

标签: php namespaces autoload

我已经设置了一个简单的自动加载来理解与命名空间一起使用时的原则。

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');

有效!

2 个答案:

答案 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;
});