Composer/PSR - How to autoload functions?

Composer PhpAutoloadPsr 0

Composer Php Problem Overview


How can I autoload helper functions (outside of any class)? Can I specify in composer.json some kind of bootstrap file that should be loaded first?

Composer Php Solutions


Solution 1 - Composer Php

You can autoload specific files by editing your composer.json file like this:

"autoload": {
    "files": ["src/helpers.php"]
}

(thanks Kint)

Solution 2 - Composer Php

After some tests, I have came to the conclusions that adding a namespace to a file that contains functions, and setting up composer to autoload this file seems to not load this function across all the files that require the autoload path.

To synthesize, this will autoload your function everywhere:

composer.json

"autoload": {
    "files": [
        "src/greetings.php"
    ]
}

src/greetings.php

<?php
    if( ! function_exists('greetings') ) {
        function greetings(string $firstname): string {
            return "Howdy $firstname!";
        }
    }
?>

...

But this will not load your function in every require of autoload:

composer.json

"autoload": {
    "files": [
        "src/greetings.php"
    ]
}

src/greetings.php

<?php
    namespace You;

    if( ! function_exists('greetings') ) {
        function greetings(string $firstname): string {
            return "Howdy $firstname!";
        }
    }
?>

And you would call your function using use function ...; like following:

example/example-1.php

<?php
    require( __DIR__ . '/../vendor/autoload.php' );

    use function You\greetings;

    greetings('Mark'); // "Howdy Mark!"
?>

Solution 3 - Composer Php

  1. Add autoload info in composer.json

{
    "autoload": {
        "psr-4": {
            "Vendor\\Namespace\\": "src/"
        }
    }
}

2. Create a OwnFunctions.php with your functions in src/Functions folder

// recommend
// http://php.net/manual/en/control-structures.declare.php
declare(strict_types=1);

namespace Vendor\Namespace\Functions\OwnFunctions;

function magic(int $number): string {
    return strval($number);
}

3. In your index.php require composer autoload

declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';

use function Vendor\Namespace\Functions\OwnFunctions\magic;

echo magic(1);

// or you can use only OwnFunctions namespace
use Vendor\Namespace\Functions\OwnFunctions;

echo OwnFunctions\magic(1);

This also can be done with const

use const Vendor\Namespace\Functions\OwnFunctions\someConst;
echo someConst;

Official docs

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmpenView Question on Stackoverflow
Solution 1 - Composer PhpmpenView Answer on Stackoverflow
Solution 2 - Composer PhpAnwarView Answer on Stackoverflow
Solution 3 - Composer PhpiamandrewlucaView Answer on Stackoverflow