У меня есть затруднения в подключении и использовании пространства имён. У меня есть два файла: index.php и lib/myspace.php (файл myspace.php, расположенный в директории lib). Код (Text): <?php //Файл index.php include('lib/myspace.php'); use lib\myspace; myfunc(); Код (Text): <?php // Файл lib/myspace.php. Директория lib располагается в той же директории, где и файл index.php namespace myspace; function myfunc() { echo 'Это моя функция'; } В результате вылазит ошибка Fatal error: Call to undefined function myfunc() in /var/www/namespaces/index.php. Объясните, пожалуйста, как правильно эти неймспейсы использовать надо. Как мои два файла надо изменить, чтобы всё заработало? У меня стоит аж PHP5.5.4.
Re: Использование namespace-ов. Как подключить пространство Код (Text): use lib\myspace; тут ошибка. надо: Код (Text): use \myspace;
Re: Использование namespace-ов. Как подключить пространство Не помогло. Когда в файле index.php я делаю Код (Text): use myspace; то возникает такая ошибка: Warning: The use statement with non-compound name 'myspace' has no effect in /var/www/namespaces/index.php on line ... Fatal error: Call to undefined function myfunc() in /var/www/namespaces/index.php on line ... Когда же я делаю Код (Text): use \myspace; то возникает такая ошибка: Fatal error: Call to undefined function myfunc() in /var/www/namespaces/index.php on line ...
Re: Использование namespace-ов. Как подключить пространство korpus, что-то у меня тоже не пашет. Работает только, если указать полный путь lib\myspace\myfunc(); А вроде всё по описанию делал. В итоге забил на них.
Re: Использование namespace-ов. Как подключить пространство К сожалению забить нельзя. В фреймворке Yii2, например, эти неймспейсы основа всего. Так что я надеюсь, что кто-нибудь объяснит.
всё просто: если ты обращаешся к классу или функции из другого неймспейса, ты должен явно указать его/её полное имя. в качестве подсказки (для классов) можно использовать use. с функциями вроде полное говно пока. на обсуждении поправки насчет функций, но они врядли пройдут, говорят . Добавлено спустя 9 минут 49 секунд: Re: Использование namespace-ов. Как подключить пространство имён Пример: alfa.php: Код (PHP): <?php namespace alfa; use beta\xxx; include './beta.php'; // It's \beta\xxx $obj = new xxx(); echo $obj->m; // It's \beta\zzz // zzz(); // ERROR \beta\zzz(); фигня состоит в том, что даже если мы укажем use beta\zzz;, при вызове нам по прежнему надо писать полное имя: \beta\zzz(); такая дискриминация функций. beta.php Код (PHP): <?php namespace beta; class xxx { public $m = 123; } function zzz() { echo 'zzz'; } Добавлено спустя 16 минут 53 секунды: Re: Использование namespace-ов. Как подключить пространство имён следующий шаг в понимании, это "относительный путь". то есть из неймспейса ololo можно обратиться к классу ololo\beta\xxx по чуть более короткому имени beta\xxx ну и к функции ololo\beta\zzz как к beta\zzz() но никакого аналога "папки на уровень выше" ..\ для неймспейсов нет приходится указывать от самого корня
Re: Использование namespace-ов. Как подключить пространство Можно сократить запись Код (Text): use beta\xxx as B; B\zzz();
Re: Использование namespace-ов. Как подключить пространство Спасибо всем за разъяснения. Сейчас мне не понятна причина, по которой после директивы Код (Text): use myspace; я должен этот неймсппейс указывать перед названием функции (или даже класса): Код (Text): myspace\myfunc(); $myclass =new myspace\myclass; Только так функция и класс находятся и с ними можно работать. Кроме того я обнаружил, что указывать use myspace; в этом случае вовсе необязательно. Просто пишешь так: Код (Text): <?php include('lib/myspace.php'); myspace\myfunc(); и всё работает. Зачем тогда нам оператор "use" нужен? Я полагаю он для того и предназначен, чтобы импортировать неймспейс и не указывать в названиях функций и классов используемый неймспейс. Добавлено спустя 14 минут 44 секунды: Re: Использование namespace-ов. Как подключить пространство имён У меня (смотри выше) получается такая же фигня и с классами.
Re: Использование namespace-ов. Как подключить пространство Ты неправильно пользуешся use. дока. Указывай в use полное имя класса, тогда ниже сможешь указывать его имя без пространства имен (или псевдоним, если указал "as"). Указывай в use полное имя неймспейса, тогда ниже сможешь указывать только последний его сегмент (или псевдоним, если указал "as"). А ты пытаешся использовать команду use как еще одну команду namespace.
Re: Использование namespace-ов. Как подключить пространство 2 artoodetoo Спасибо за разъяснение. Оказывается, неймспейсы не так уж и запутаны. Просто в них оперируют именами классов, функций и констант, чтобы не писать длинные названия. Добавлено спустя 3 минуты 52 секунды: Re: Использование namespace-ов. Как подключить пространство имён А мне показалось, что работа с функциями в неймспейсах точно такая же, как и с классами. С чего вы взяли, что в функциях что-то по-другому? У меня PHP5.5.4
Re: Использование namespace-ов. Как подключить пространство быстро ты заматерел ну ты продемонстрируй что-то, чего ты понял, а я ещё нет. давай сразу рабочий код с комментариями как ты его понимаешь. люблю узнавать что-то новое!