Пространства имен PHP do not требуют, чтобы вы помещали файлы в разные каталоги, даже если их синтаксис несколько напоминает путь к файловой системе.Например, это прекрасно работает:
FooBar.php:
<?php
namespace MyNamespace;
class Foo { // Helper class for FooBar
function toString() {
return "Foo!";
}
}
class FooBar {
public $foo;
function __construct() {
$this->foo = new Foo();
}
}
index.php :
<?php
include("FooBar.php");
use MyNamespace\FooBar;
class Foo { // a new Foo object
function toString() {
return "Foo #2!";
}
}
$foobar = new FooBar();
$foo = new Foo();
echo $foobar->foo->toString(), "\n";
echo $foo->toString(), "\n";
При наличии обоих файлов в текущем каталоге, приведенных выше, при запуске php index.php
в командной строке будет напечатано:
Foo!
Foo #2!
Однако вы, вероятно, должны следовать рекомендациям по стандартам PHP, в частности PSR-1 и PSR-4 , которые, помимо прочего, требуют, чтобы каждый класс находился в отдельном файле, имя которого совпадает с именем класса (плюс.php
суффикс) и принадлежать пространству имен, которое каким-то образом соответствует пути его файловой системы (хотя PSR-4 допускает некоторые различия в способе имен пространства имен сопоставляться с путями файловой системы).
Если бы вы следовали этим рекомендациям, вы не столкнулись бы с этой проблемой с самого начала , так как два ваших Foo
класса естественно принадлежали бы разным пространствам имен и, следовательно, не конфликтовали бы.