在php中自动加载整个命名空间(用于函数而不是类)

时间:2017-08-07 11:52:40

标签: php namespaces

我正在尝试使用一堆辅助函数自动加载一个命名空间:

<?php

namespace App\Str {
    function contains($haystack, $needles)
    {
        foreach ((array)$needles as $needle) {
            if ($needle !== '' && mb_strpos($haystack, $needle) !== false) {
                return true;
            }
        }
        return false;
    }

    function starts_with($haystack, $needles)
    {
        foreach ((array) $needles as $needle) {
            if ($needle !== '' && substr($haystack, 0, strlen($needle)) === (string) $needle) {
                return true;
            }
        }
        return false;
    }
}

Psr-4作曲家自动加载在这里没有帮助:

Call to undefined function App\Str\starts_with()

我知道我不能(懒惰地)自动加载功能,而且我正在建议使用静态函数创建一个类,但是我更喜欢函数式编程,我想首先研究其他选项。例如,我可以以某种方式(懒惰地)自动加载整个命名空间本身吗?我想以下列方式使用此命名空间:

use App\Str as Str;

$test = Str\starts_with('test', 't');

我想以某种方式指定编写器,如果它看到App\Str命名空间,它应该懒得要求文件app/Str.php,不确定作曲家是如何工作的,但不会是这样的可能的?

2 个答案:

答案 0 :(得分:3)

不幸的是,这是不可能的。如果你想要非延迟自动加载,你必须将它添加到你的composer.json:

$i++
    Write-Host "$found: $i - Current $ $_"

每个条目都是带有您功能的文件名。

答案 1 :(得分:0)

我最近偶然发现了相同的问题,即:

  • 我想在PHP中使用函数式编程
  • 我不想为我的函数(静态或其他)使用类包装器
  • 我只想在使用它们时才加载功能定义文件

对我有用的解决方案是为加载所有功能定义文件的功能模块创建Loader类。

<?php

namespace App;

class Loader
{
    public function load()
    {
        require_once(__DIR__."/Str.php");
        require_once(__DIR__."/Submodule/File2.php");
        require_once(__DIR__."/Arr.php");
        // etc ...
    }

}

然后,当我要使用功能模块时,我先加载它:

<?php

use App;

(new App\Loader())->load();

App\Str\starts_with('test', 't');