Как использовать пространства имен, не классы, 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 (загрузить только то, что используется, например, по требованию), что может означать много файлов, имеющихся ты ничего

Author: Costamilam, 2019-01-11

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#

 1
Author: novic, 2019-01-14 23:00:23

И Я еще не понял, потому что использовать таким образом, вы просто хотите вызвать функцию правильно? Если это было бы проще создать помощника и с его помощью можно создать функцию и вызвать тот же.

Для этого я добавил следующую строку в мой composer указывая место моего помощника.

"autoload": {
    "files": [
        "app/Helpers/helper.php"
    ],
    "psr-4": {
        "App\\": "app/"
    }
}
 1
Author: Daniel Bruno, 2019-01-11 13:37:30