Где хранится класс с пространством имен?

У меня есть файл с пространством имен PHP

namespace A\B\C
$cls = new foo();

Где хранится класс foo?

ИЛИ, если существует __autoload(), как управлять сопоставлением каталогов с пространством имен?

Спасибо за помощь. Я пытаюсь лучше понять связь между каталогами и пространствами имен. PHP и/или Google не дают мне никакого ответа.


person radio    schedule 03.05.2015    source источник
comment
Ознакомьтесь с PSR-4.   -  person Mark Baker    schedule 04.05.2015
comment
Спасибо за ссылку Марк. PSR это хорошая деятельность.   -  person radio    schedule 04.05.2015


Ответы (1)


Между каталогами и пространствами имен нет прямой связи, за исключением случаев, когда вы используете автозагрузчик.

Если вы хотите, чтобы этот код работал:

namespace A\B\C;
$cls = new foo();

Вы должны сделать это:

namespace A\B\C;
class foo {}
$cls = new foo();

Или сделайте следующее:

foo.php

namespace \A\B\C;

class foo {}

index.php

require 'foo.php';

$cls = new \A\B\C\foo();
// or
namespace A\B\C;
$cls = new foo();

Теперь, если вы хотите использовать автозагрузчик, вы можете использовать что-то вроде этого:

function autoload($class)
{
    $class = str_replace('\\', '/', $class);

    require_once __DIR__ . '/' . $class . '.php';
}
spl_autoload_register('autoload');

Поместите этот код в начало вашего index.php и получите такую ​​​​директорную арку:

A
+ B
| + C
| | + foo.php

Тогда вам просто нужно сделать:

$cls = new \A\B\C\foo();

или даже :

use \A\B\C\foo;
$cls = new foo();

Но в любом случае, ВЫ ДОЛЖНЫ ПРОЧИТАТЬ РУКОВОДСТВО: ссылка здесь

person Bobot    schedule 03.05.2015
comment
Спасибо Bob0t. У меня уже есть красный мануал, но я не могу поймать ядро. Ваш ответ разъясняет это. Насколько я понял. PHP создает полное имя пространства имен из объявления NS и имени класса. Это полное имя похоже на \A\B\C\foo, где foo — имя класса. Итак, когда я хочу загрузить файл, в котором хранится класс, я ДОЛЖЕН перевести это полное имя в правильное местоположение файла, например. с автозагрузкой. Таким образом, должна быть сильная связь между путем NS и путем к файлу. Правильно? Теперь, когда я хочу реализовать другие библиотеки, мне нужно понять, как путь NS отображается в файлы. Правильно? - person radio; 04.05.2015
comment
Да, на самом деле, если вы используете NS, это в основном для сортировки ваших классов в файлах, например, я всегда использую одну и ту же библиотеку Core, поэтому ее NS — \Core, а все классы находятся в каталоге ROOT . 'Core/', понимаете? В этом ядре у меня есть несколько классов, связанных с базой данных, они относятся к Core/Database, поэтому используемое пространство имен — \Core\Database. Я не знаю, действительно ли я понимаю это: / есть хорошие видеоуроки, которые вы должны найти в Интернете :) - person Bobot; 05.05.2015