есть 2 файла в корне сайта: global.php: Код (Text): <?php // global.php class Lister{ public static function helloWorld() { print "Привет из глобального пространства"; } } и index.php: Код (Text): <?php // index.php namespace com\getinstance\util; require_once 'global.php'; class Lister{ public static function helloWorld(){ print "Привет из " . __NAMESPACE__ . "<br>"; } } Lister::helloWorld(); \Lister::helloWorld(); мне непонятно, почему при определении класса Lister в файле index.php (на 6 строке) PHP не выдает ошибку, ведь используй я вместо require оператор use, подключающий пространство имен с таким же классом Lister, PHP выдал бы ошибку. Я новичек, поэтому прошу объяснить на пальцах.
потому что они в двух разных космических пространствах. Зацени фильм https://zona.mobi/movies/interstellar поймешь --- Добавлено --- PHP: Lister::helloWorld(); # берет пространство файла в итоге com\getinstance\util\Lister::helloWorld() \Lister::helloWorld(); # \ перед именем, означает вызывать что - то с нашего человекоподобного пространства :)
Use не подгружает файлы, а просто указывает использование пространства имен. Соответственно, файл не был бы подключен, глобальное пространство было бы не определено, вот он и выдал бы ошибку, что не может найти глобальное пространство. Но можно, конечно, писать namespace-ы как пути, а потом настроить composer на загрузку файлов при использовании use, что и используется во фреймворках.
незнаю, меня тут не наругают сильно за оффтоп.. но Gravity.php: PHP: <?php //Gravity.php interface Gravity{ static function sendQueantumData(); } BlackHole.php: PHP: <?php // BlackHole.php namespace BlackHole; require_once 'Gravity.php'; require_once 'Earth.php'; use Gravity; use Earth\Room; class QuantumData{ public static $quantumData = '1+1 != 2'; } class DataTransmitter implements Gravity{ private static $veryImportantQuantumData = ''; public static function getQuantumData(){ self::$veryImportantQuantumData = QuantumData::$quantumData; } public static function sendQueantumData(){ self::getQuantumData(); Room::$watch_data .= self::$veryImportantQuantumData; } } DataTransmitter::sendQueantumData(); echo Room::$watch_data; Earth.php: PHP: <?php // Earth.php namespace Earth; require_once 'Gravity.php'; use Gravity; class Room implements Gravity{ static $watch_data = ''; static function sendQueantumData(){ echo $watch_data; } static function STAY(){ return "<img src='https://admin.mashable.com/wp-content/uploads/2013/07/crying-waterfalls.gif'>"; } }
про пространства я понимал и раньше. просто мне не совсем понятно, почему при подключении (require_once global.php) не происходит попытка определения класса Lister. Ведь по сути код файла global.php просто вставляется и выполняется. Так? и мы начинаем использовать пространство имен namespace com\getinstance\util, а потом уже в нем подключаем файл global.php. Не совсем ясно кака это работает. Аналогия с фильмом превосходная, однако нюансы не раскрывает. Если можно чуточку подробнее. аналогию бы, раскрывающую как работает USE. Лайкну в любом случае, конечно. Фильм шедевр, редко так снимают, плакал как мелкий, при каждом пересмотре после фразы "потому что мой папа пообещал мне..." С тех пор посматриваю почаще в сторону фантастики, вдруг что-то похожее сняли.
потому что выше как там его... index.php находится в пространстве com\getinstance\util и подключает global.php у которого пространство дефолт. \Lister::helloWorld(); обратились к дефолтному астралу где находится класс Листер конечно есть, лови https://zona.mobi/movies/peklo-2007
Это двойственность php. По сути, require просто включает файл, да. Но, при этом, у него остаётся свой namespace, а не пространство имён определённое в том файле, в котором он включается. Иначе бы от пространств имён толку не было. В пыхе много таких штук, его за это часто ругают.
Для ясности картины мне осталось понять смысл "use". Смысл только в том, чтобы создать алиас на случай совпадения имен классов и в том чтобы укоротить пути? Ведь по сути можно использовать только require и все. А "use as" используется только когда реквайрится файл с таким же неймспейсом и таким же именем класса?
use - чтоб не писать каждый раз полное имя, да. use as - чтоб нивелировать конфликт имён с текущим пространством. --- Добавлено --- Ещё про автозагрузку и PSR прочитайте, для того, чтоб уже совсем разобраться с этим. Позволяют убрать необходимость require