За последние 24 часа нас посетили 17822 программиста и 1612 роботов. Сейчас ищут 1422 программиста ...

Использование namespace-ов. Как подключить пространство имён

Тема в разделе "Прочие вопросы по PHP", создана пользователем korpus, 4 ноя 2013.

  1. korpus

    korpus Активный пользователь

    С нами с:
    30 окт 2010
    Сообщения:
    10
    Симпатии:
    0
    У меня есть затруднения в подключении и использовании пространства имён.
    У меня есть два файла: index.php и lib/myspace.php (файл myspace.php, расположенный в директории lib).
    Код (Text):
    1.  
    2. <?php
    3. //Файл index.php
    4.  
    5. include('lib/myspace.php');
    6. use lib\myspace;
    7. myfunc();
    Код (Text):
    1.  
    2. <?php
    3. // Файл lib/myspace.php. Директория lib располагается в той же директории, где и файл index.php
    4. namespace myspace;
    5.  
    6. function myfunc()
    7. {
    8.     echo 'Это моя функция';
    9. }
    В результате вылазит ошибка Fatal error: Call to undefined function myfunc() in /var/www/namespaces/index.php. Объясните, пожалуйста, как правильно эти неймспейсы использовать надо. Как мои два файла надо изменить, чтобы всё заработало? У меня стоит аж PHP5.5.4.
     
  2. zelenin

    zelenin Активный пользователь

    С нами с:
    5 дек 2012
    Сообщения:
    35
    Симпатии:
    0
    Re: Использование namespace-ов. Как подключить пространство

    Код (Text):
    1. use lib\myspace;
    тут ошибка. надо:
    Код (Text):
    1. use \myspace;
     
  3. korpus

    korpus Активный пользователь

    С нами с:
    30 окт 2010
    Сообщения:
    10
    Симпатии:
    0
    Re: Использование namespace-ов. Как подключить пространство

    Не помогло. Когда в файле index.php я делаю
    Код (Text):
    1. 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):
    1. use \myspace;
    то возникает такая ошибка:
    Fatal error: Call to undefined function myfunc() in /var/www/namespaces/index.php on line ...
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Re: Использование namespace-ов. Как подключить пространство

    korpus, что-то у меня тоже не пашет. Работает только, если указать полный путь lib\myspace\myfunc(); А вроде всё по описанию делал. В итоге забил на них.
     
  5. korpus

    korpus Активный пользователь

    С нами с:
    30 окт 2010
    Сообщения:
    10
    Симпатии:
    0
    Re: Использование namespace-ов. Как подключить пространство

    К сожалению забить нельзя. В фреймворке Yii2, например, эти неймспейсы основа всего. Так что я надеюсь, что кто-нибудь объяснит.
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    всё просто: если ты обращаешся к классу или функции из другого неймспейса, ты должен явно указать его/её полное имя.
    в качестве подсказки (для классов) можно использовать use. с функциями вроде полное говно пока. на обсуждении поправки насчет функций, но они врядли пройдут, говорят :(.

    Добавлено спустя 9 минут 49 секунд:
    Re: Использование namespace-ов. Как подключить пространство имён
    Пример:

    alfa.php:
    Код (PHP):
    1. <?php
    2. namespace alfa;
    3. use beta\xxx;
    4. include './beta.php';
    5.  
    6. // It's \beta\xxx
    7. $obj = new xxx(); 
    8. echo $obj->m;
    9.  
    10. // It's \beta\zzz
    11. // zzz(); // ERROR
    12. \beta\zzz();
    фигня состоит в том, что даже если мы укажем use beta\zzz;, при вызове нам по прежнему надо писать полное имя: \beta\zzz();
    такая дискриминация функций.

    beta.php
    Код (PHP):
    1. <?php
    2. namespace beta;
    3.  
    4. class xxx
    5. {
    6.     public $m = 123;
    7. }
    8.  
    9. function zzz()
    10. {
    11.     echo 'zzz';
    12. }
    Добавлено спустя 16 минут 53 секунды:
    Re: Использование namespace-ов. Как подключить пространство имён
    следующий шаг в понимании, это "относительный путь".
    то есть из неймспейса ololo можно обратиться к классу ololo\beta\xxx по чуть более короткому имени beta\xxx
    ну и к функции ololo\beta\zzz как к beta\zzz()

    но никакого аналога "папки на уровень выше" ..\ для неймспейсов нет :) приходится указывать от самого корня
     
  7. noganno

    noganno Новичок

    С нами с:
    26 авг 2013
    Сообщения:
    58
    Симпатии:
    0
    Re: Использование namespace-ов. Как подключить пространство

    Можно сократить запись
    Код (Text):
    1.  
    2. use beta\xxx as B;
    3.  
    4. B\zzz();
     
  8. korpus

    korpus Активный пользователь

    С нами с:
    30 окт 2010
    Сообщения:
    10
    Симпатии:
    0
    Re: Использование namespace-ов. Как подключить пространство

    Спасибо всем за разъяснения.
    Сейчас мне не понятна причина, по которой после директивы
    Код (Text):
    1. use myspace;
    я должен этот неймсппейс указывать перед названием функции (или даже класса):
    Код (Text):
    1. myspace\myfunc();
    2. $myclass =new myspace\myclass;
    Только так функция и класс находятся и с ними можно работать.
    Кроме того я обнаружил, что указывать use myspace; в этом случае вовсе необязательно. Просто пишешь так:

    Код (Text):
    1.  
    2. <?php
    3. include('lib/myspace.php');
    4. myspace\myfunc();
    и всё работает. Зачем тогда нам оператор "use" нужен? Я полагаю он для того и предназначен, чтобы импортировать неймспейс и не указывать в названиях функций и классов используемый неймспейс.

    Добавлено спустя 14 минут 44 секунды:
    Re: Использование namespace-ов. Как подключить пространство имён
    У меня (смотри выше) получается такая же фигня и с классами.
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Re: Использование namespace-ов. Как подключить пространство

    Ты неправильно пользуешся use. дока.

    Указывай в use полное имя класса, тогда ниже сможешь указывать его имя без пространства имен (или псевдоним, если указал "as").
    Указывай в use полное имя неймспейса, тогда ниже сможешь указывать только последний его сегмент (или псевдоним, если указал "as").

    А ты пытаешся использовать команду use как еще одну команду namespace.
     
  10. korpus

    korpus Активный пользователь

    С нами с:
    30 окт 2010
    Сообщения:
    10
    Симпатии:
    0
    Re: Использование namespace-ов. Как подключить пространство

    2 artoodetoo
    Спасибо за разъяснение. Оказывается, неймспейсы не так уж и запутаны. Просто в них оперируют именами классов, функций и констант, чтобы не писать длинные названия.

    Добавлено спустя 3 минуты 52 секунды:
    Re: Использование namespace-ов. Как подключить пространство имён
    А мне показалось, что работа с функциями в неймспейсах точно такая же, как и с классами. С чего вы взяли, что в функциях что-то по-другому? У меня PHP5.5.4
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Re: Использование namespace-ов. Как подключить пространство

    быстро ты заматерел :) ну ты продемонстрируй что-то, чего ты понял, а я ещё нет. давай сразу рабочий код с комментариями как ты его понимаешь.

    люблю узнавать что-то новое!