PHP不同的路径名空间和自动加载不起作用

时间:2012-02-19 14:58:54

标签: php namespaces php-5.3 autoload

我正在尝试使用命名空间在Php5.3中实现自动加载,但我遇到了一些问题而且不知道为什么它不起作用。

我有

的基本目录结构
/root
--bootstrap.php
--test.php
--/src
----/com
------/a
--------Foo.php
------/b
--------Bar.php

bootstrap.php中

<?php
function __autoload($class) {  
    // convert namespace to full file path  
    echo $class.'<br>';
    $class = str_replace('\\', '/', $class) . '.php';  
    require_once($class);  
}

Foo.php

<?php
namespace src\com\a {

    class Foo {

        public function write() {
            echo "write";
        }
    }
}

Bar.php

<?php

use \src\com\a\Foo;

namespace src\com\b {

    class Bar {

        public function write() {
            $foo = new Foo();
            $foo->write();
        }
    }
}

test.php的

<?php
use \src\com\b\Bar;
require_once("bootstrap.php");

$bar = new Bar();
$bar->write();

所以基本前提是调用Bar,后者又包含Foo并调用write方法

输出:

src\com\b\Bar
src\com\b\Foo

但是当我尝试自动加载时,它认为Foo位于src / com / b的命名空间中,因为它是Bar的命名空间,因此它不会加载。

有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:1)

看起来 bar.php 应该是:

<?php


namespace src\com\b;
use \src\com\a\Foo;

    class Bar {

        public function write() {
            $foo = new Foo();
            $foo->write();
        }
    }

?>