Как использовать пространства имен, не классы, autoload в composer?
Я пытаюсь использовать пространства имен без классов, autoload в composer, но я считаю, что то же самое происходит сбой, например:
/Foo/Bar.php
namespace Foo\Bar {
function baz() {
echo 'Funcionou';
}
}
/index.php
require './vendor/autoload.php';
Foo\Bar\baz();
, запустив файл index генерирует следующее сообщение об ошибке:
Fatal error: Uncaught Error: Call to undefined function Foo\Bar\baz() in /[...]/basic/index.php on line 5
Однако, если я включаю в непредвиденных использования ранее файл:
/index.php
require './Foo/Bar.php';
Foo\Bar\baz();
, То работает. Я считаю, что при вызове Foo\Bar\baz
он пытается включить файл Foo\Bar\baz.php
, но я не уверен,
Моя autoload в composer.json
:
"autoload": {
"psr-4": {
"Foo\\": "./Foo"
}
}
Сделал dump-autoload
использование в framework, в котором пользователь может создавать маршруты, проходящие функцию в пространство имен, чтобы быть выполнена (например, Router::get('/foo', 'App\Foo\get');
), как правило, не нужно сохранять состояние, класс становится ненужным. Использование имущества files
композитор решает проблему, но не позволяет lazy load (загрузить только то, что используется, например, по требованию), что может означать много файлов, имеющихся ты ничего
2 answers
Такого рода реализация соответствует организации папке namespace
должны иметь один и тот же путь папки", которые не то, что происходит в вашем вопросе, правильным было бы создать папку следующим образом:
/Foo/Bar/Bar.php
И namespace
соответствующем
Foo/Bar
В файле конфигурации composer.json
настройте следующим образом:
{
"name": "Virgilio/Pack",
"autoload": {
"psr-4": {
"Foo\\Bar\\": "Foo/Bar"
}
}
}
То есть, первого ключа namespace
и менять путь к папке (или папках), поверните теперь команда php composer.phar dump
.
Другой, однако, что эта реализация load
classes
, а не в функции, функций-это ключ files
, который должен быть реализован на путь к файлу, например:
{
"name": "Virgilio/Pack",
"autoload": {
"psr-4": {
"Foo\\Bar\\": "Foo/Bar"
},
"files": [
"Foo/Bar/Bar.php"
]
}
}
Поверните команду php composer.phar dump
.
Стоит помнить, что в этом файле Bar.php
правильным является только иметь функции или classes
, а также, если будет иметь только функции, не нужно размещать namespace
, но, ничего не мешает, я считаю, затруднить ввод во время программирования.
Аннотация настраивается так:
{
"name": "Virgilio/Pack",
"autoload": {
"files": {
"Foo/Bar/Bar.php"
}
}
}
И используется в качестве namespace
таким образом:
echo \Foo\Bar\baz();
Или вытащить этот namespace
что я считаю ненужным в файл Bar.php
введите:
echo baz();
И попробуйте сделать код более чистым и менее громоздким для использования.
Еще один простой пример: пространства имен php и чтение recomendavel The composer.json Schema - PSR-4#
И Я еще не понял, потому что использовать таким образом, вы просто хотите вызвать функцию правильно? Если это было бы проще создать помощника и с его помощью можно создать функцию и вызвать тот же.
Для этого я добавил следующую строку в мой composer указывая место моего помощника.
"autoload": {
"files": [
"app/Helpers/helper.php"
],
"psr-4": {
"App\\": "app/"
}
}