Задать вопрос

В чем разница между namespace и use? И как они связаны с файловой системой?

Здравствуйте. Изучаю php, дошел до классов и пространств имен.
Сразу скажу, что изучая php я и читаю мануал, но я так и не понял, как задавать пространства имен, как они связаны с файловой системой, в чем разница между use и namespace?
www.php-fig.org/psr/psr-4 не прояснил ситуацию, а еще больше её усугубил.
Я понимаю, что вопрос скорей всего очень глупый, поэтому очень прошу отнестись с терпением и пониманием :).
Заранее благодарен всем отозвавшимся.
  • Вопрос задан
  • 5218 просмотров
Подписаться 5 Средний Комментировать
Решения вопроса 2
@AlikDex
попытаюсь более человечнее написать =)

с файловой системой ни то ни другое никак не связаны. Просто приняли так, чтобы путь совпадал с namespace'ом, стандартизировали короче для удобства. Ну и свои плюсы имеются конечно же.

namespace это установка пространства имен. Скажем так - виртуальная коробочка, в которой лежат всякие штуки (классы). Это дает возможность использовать одинаковые названия классов для одного приложения.

use указывает какой класс из какого пространства имен использовать. Его можно не писать, но тогда придется вызывать классы вместе с их namespace (если у тех классов они заданы, если нет, то все равно надо указывать глобальное пространство "\").
типа: $customers = new \app\models\Customers();

а с use будет:
<?php
namespace app;
use app\models\Customers;

$customers = new Customers();

$imagick = new \Imagick(); // вызов из глобала. обратный слеш нужен когда указан какой-либо неймспейс для этого файла. Иначе попытается вызвать из текущего пространства, что приведет соотвественно к ошибке.


В мануале все четко расписано в принципе, читай и пытайся понять =)
Ответ написан
Комментировать
@MadridianFox
Web-программист, многостаночник
На уровне языка пространства имён с файловой системой никак не связаны.
Пространства имён - лишь способ решить конфликты имён классов.
Вот ты говоришь - у меня есть класс ClassName, но к сожалению, такой класс уже есть в одной из библиотек, которые ты используешь. Можно было бы назвать класс MyClassName, ну и везде добавлять приставку My. Редко, но бывает что надо сделать два класса с одинаковым именем в одном проекте. Тогда ты называешь один класс MyBananaSybsystemClassName, а другой MyAnanasSubsystemClassName - тем самым обозначая разницу в названии.
И даже это не спасёт от простого совпадения.

И тут на помощь приходят пространства имён.
В начале файла в котором лежат классы (лучше один класс в одном файле) пишется название пространсва имён, вот так:
namespace banana;
И теперь все классы, объявленные в этом пространстве имён имеют название banana\ClassName, хотя внутри этого файлв ты можешь по прежнему обращаться к ним просто по ClassName.
В другом файле надо использовать полное название, вроде как:
$obj = new banana\ClassName();
но, если надо много раз писать название класса можно сделать вот так:
use banana\ClassName;
$obj = new ClassName();

, но самое полезное здесь это разрешение конфликтов. Если вдруг в другом месте определён такой же ClassName, то можно просто переименовать его:
use banana\ClassName;
use ananas\ClassName as AnanasClass;
$obj1 = new ClassName();
$obj2 = new AnanasClass();


Вот это и есть суть пространства имён. Таковы они во всех языках программирования в которых они есть.
Но есть от них ещё одна польза - можно настроить автоматическое подключение unclude(); файла с классом.
Делается это с помощью определения функции автозагрузки
function __autoload($classname){
// как-то по имени класса находим файл и подключаем
}
// или, лучше
spl_autoload_register(function ($classname) {
   // как-то по имени класса находим файл и подключаем
});


Каждый раз, когда ты обращаешься к классу и php не может его найти в подключенных файлах - запускается код написанный в функции автозагрузки. В эту функцию передаётся название класса.
При чём же тут пространства имён? А при том, что в функцию автозагрузки передаётся полное имя класса с пространтсвом имён.
Это значит что ты можешь делать по одному файлу на класс, класть их в папки, а в пространство имён в каждом файле писать путь до этого файла.
После этого пишешь функцию, которая просто заменяет в названии класса слеши на те, что поддерживаются операционной системой как разделители пути, и просто подключаешь файл.
Именно об этом и написано в каком-то там PSR
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
miraage
@miraage
Старый прогер
Ответ написан
Комментировать
arutyunov
@arutyunov
Mooza.ru — Делаем сайты
Неймспейсы — это виртуальные папки для ваших классов. Например, вы пишете расширение, содержащее несколько классов. Их удобно поместить в один общий неймспейс.

Директива use используется, когда вы хотите использовать в текущем файле класс из какого-нибудь неймспейса. ПХП автоматически на основе инструкций по автозагрузке классов подключит файл с нужным классом и вы сможете обращаться к нужному классу по его имени, без использования неймспейса.
Например, вы можете обращаться к классу так:
$a = new \Base\Framework\Model();
или с use:
use \Base\Framework\Model;
$a = new Model();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы