Невозможно импортировать / использовать функцию пространства имен в PHP - PullRequest
5 голосов
/ 13 апреля 2011

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

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

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

use Test\testFunc,
    Test\TestClass;

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

Ответы [ 3 ]

3 голосов
/ 13 апреля 2011

См. http://php.net/manual/en/language.namespaces.rules.php с особым вниманием к:

<?php
namespace A;
use B\D, C\E 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

my\foo();   // calls function "foo" defined in namespace "A\my"

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

И

// static methods/namespace functions from another namespace

B\foo();    // calls function "foo" from namespace "A\B"

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

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

\B\foo();   // 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"
0 голосов
/ 18 февраля 2019

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

require_once __DIR__ . "/../../path/to/your/vendor/autoload.php";
use function myprogram\src\Tools\MyFunc;
//use the imported function
MyFunc();

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

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

А затем запустите composer dump-autoload, чтобы обновить autoload.php.

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

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

require_once full\path\to\ScriptWithMyFunc.php;
MyFunc();

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

0 голосов
/ 24 сентября 2014

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...