Composer/PSR - 如何自动加载函数?

Posted

技术标签:

【中文标题】Composer/PSR - 如何自动加载函数?【英文标题】:Composer/PSR - How to autoload functions? 【发布时间】:2014-08-01 23:48:26 【问题描述】:

如何自动加载辅助函数(在任何类之外)?我可以在composer.json 中指定某种应该首先加载的引导文件吗?

【问题讨论】:

【参考方案1】:

您可以像这样编辑composer.json 文件来autoload specific files:

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

(感谢Kint)

【讨论】:

请注意,在调用自动​​加载文件时,该文件将始终包含在内 - 所以最好快点,否则每个使用它的 php 脚本都会受到影响。 这很有帮助,谢谢。建议先检查函数是否存在: if (!function_exists('myfunction')) 如何加载一个functions.php 文件,该文件只包含来自Git 存储库的函数?我有权编辑包的 composer.json 文件。 @DonnieAshok 不确定 Git 与它有什么关系。如果这是您要的,则无法远程加载功能。只需将src/helpers.php 更改为path/to/functions.php。如果不清楚,您可能想问一个新问题。 对于已经设置了 PSR-4 自动加载模式并希望以与类相同的方式自动加载函数的人来说,这不是一个合适的答案。【参考方案2】:

经过一些测试,我得出的结论是,将命名空间添加到包含函数的文件中,并设置 composer 来自动加载这个文件似乎不会在所有需要自动加载路径的文件中加载这个函数。

为了合成,这将在任何地方自动加载你的函数:

composer.json

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

src/greetings.php

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

...

但这不会在自动加载的每个要求中加载您的函数:

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!";
        
    
?>

您可以使用use function ...; 调用您的函数,如下所示:

example/example-1.php

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

    use function You\greetings;

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

【讨论】:

那是因为您的条件不正确-您应该使用FQN for function_exists(): if(!function_exists('You\greetings'))。它与自动加载无关。 您也可以使用if (! function_exists(__NAMESPACE__ . '\greetings')) 来避免重复 FQDN 太多次,这样在开发过程中必要时可以更轻松地移动命名空间。 +1 用于工作示例,如果您不想在每个函数调用之前指定命名空间,只需将 use function You\greetings; 添加到文件顶部【参考方案3】:
    composer.json 中添加自动加载信息

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

    src/Functions 文件夹中使用您的函数创建一个OwnFunctions.php
// 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);

    在您的index.php 中要求作曲家自动加载
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);

这也可以用 const 来完成

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

Official docs

【讨论】:

这不会自动加载任何东西 - 函数不能在 PHP 中自动加载,自动加载仅适用于类。 你是对的。这仅在手动包含文件或在同一文件中包含多个命名空间时才有效。

以上是关于Composer/PSR - 如何自动加载函数?的主要内容,如果未能解决你的问题,请参考以下文章

composer+psr-4实现自动加载

未找到Composer PSR-4 Autoload类

本地目录自动加载 - “未找到类”

本地目录自动加载 - “找不到类”

thinkphp中使用composer

tp5怎么调用common里面自定义的函数