Невозможно импортировать / использовать функцию пространства имен в PHP

#php #namespaces

#php #пространства имен

Вопрос:

У меня есть файл с пространством имен, называемый test.php с помощью функции и класса:

 namespace Test;
function testFunc(){}
class TestClass{}
  

Тогда, если в другом файле я «использую» оба этих элемента пространства имен, класс работает, но не функция:

 use TesttestFunc,
    TestTestClass;

include "test.php";
new TestClass();
testFunc();
  

Объект TestClass создан нормально, но я получаю неустранимую ошибку для TestFunc():

 Fatal error: Call to undefined function testFunc()
  

Я думал, что функции поддерживаются пространствами имен. Что я делаю не так?

РЕДАКТИРОВАТЬ: Объяснение здесь — http://www.php.net/manual/en/language.namespaces.faq.php#language.namespaces.faq.nofuncconstantuse

Ответ №1:

Смотрите http://php.net/manual/en/language.namespaces.rules.php уделяя особое внимание:

 <?php
namespace A;
use BD, CE as F;

// function calls

foo();      // first tries to call "foo" defined in namespace "A"
            // then calls global function "foo"

foo();     // calls function "foo" defined in global scope

myfoo();   // calls function "foo" defined in namespace "Amy"

F();        // first tries to call "F" defined in namespace "A"
            // then calls global function "F"
  

И

 // static methods/namespace functions from another namespace

Bfoo();    // calls function "foo" from namespace "AB"

B::foo();   // calls method "foo" of class "B" defined in namespace "A"
            // if class "AB" not found, it tries to autoload class "AB"

D::foo();   // using import rules, calls method "foo" of class "D" defined in namespace "B"
            // if class "BD" not found, it tries to autoload class "BD"

Bfoo();   // calls function "foo" from namespace "B"

B::foo();  // calls method "foo" of class "B" from global scope
            // if class "B" not found, it tries to autoload class "B"
  

Комментарии:

1. То есть в принципе вы не можете импортировать функции так же, как классы? Пример также не проясняет константы, я предполагаю, что они одинаковы? На самом деле, вот более четкое объяснение — php.net/manual/en /…

Ответ №2:

Я полагаю, что функции пространства имен (порт use ключевого слова для функции и констант) будут частью PHP 5.6

Смотрите также:

https://github.com/php/php-src/pull/526

https://wiki.php.net/rfc/use_function

Ответ №3:

Начиная с PHP 5.6 и выше, вы можете импортировать / использовать функции из других файлов PHP следующим образом:

 require_once __DIR__ . "/../../path/to/your/vendor/autoload.php";
use function myprogramsrcToolsMyFunc;
//use the imported function
MyFunc();
  

Однако для PHP 7.0 мне нужно было добавить функцию в «files» в composer.json:

 "autoload" : {
    "psr-4" : {
      "myprogram\src\" : "myprogram/src/"
    },
"files" : [
      "myprogram/src/Tools/ScriptWithMyFunc.php"
    ]
  

А затем запустите composer dump-autoload для обновления autoload.php .

АЛЬТЕРНАТИВНО:

Вы также можете импортировать функции из скриптов напрямую, без composer:

 require_once fullpathtoScriptWithMyFunc.php;
MyFunc();
  

Но (по крайней мере, для меня) это работает только тогда, когда ScriptWithMyFunc.php не имеет пространства имен.