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


PHP - namespaces and autoloading issues

我设置了一个简单的自动加载,以了解与命名空间一起工作时的原理。

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