PHP разные пути к пространствам имен и автозагрузка не работает - PullRequest
0 голосов
/ 19 февраля 2012

Я пытаюсь реализовать автозагрузку в 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 Ответ

1 голос
/ 19 февраля 2012

Похоже, bar.php должно быть:

<?php


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

    class Bar {

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

?>
...