#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
Смотрите также:
Ответ №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 не имеет пространства имен.