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 时我得到 致命错误:Class 'House\Toy' not found in test.php on line 18

我没看错什么?

删除 __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() 并且会失去它的 magic 意思。

另外,将命名空间House的文件存放在名为House的文件夹中不是更好吗? (您目前正在使用 Room)。如果你这样做,__autoload() 函数可以写得更一般:

function __autoload($classname)
{
    $parts = explode('\', $classname);
    $path = implode('/', $parts) . '.php';
    require_once($path);
}

尝试改用此自动加载器 :) 并将目录 Room 的绝对路径添加到您的包含路径。 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;
});