将声明在自动加载的命名空间类文件中的函数变成全局函数

8

我的要求可能看起来像是糟糕的做法,但不管怎样我还是想知道它是否可行。

我正在使用composer来自动加载我的类。在其中一个类文件中,我想定义一个可以在全局命名空间内使用的函数缩写。由于composer的要求,这个类需要有命名空间。

我的问题:是否通过轻微的修改,有任何方法使其正常工作?

MyClass.php:

<?php

namespace Jodes;

class MyClass {
    public function __construct() {
        echo "I am the class";
    }
}

function fn(){
    echo "I am a shorthand for doing stuff";
}

index.php:

<?php

require_once '../vendor/autoload.php';

use Jodes\MyClass;

new MyClass();

// Jodes\fn();  // works
// fn();        // doesn't work

composer.json

{
    "name": "jodes/mypackage",
    "autoload": {
        "psr-4" : {
            "Jodes\\" : "src"
        }
    }
}

尽管阅读无数链接,我已经尝试了我所想到的一切,但仍然没有成功。

谢谢

1个回答

12

首先,如果这个函数不是 MyClass 的一部分,那么它就不应该放在同一个文件中。惯例是将每个类(仅限于该类)放在单独的文件中。

对于像您的 fn() 这样可全局使用的帮助函数,您需要一个单独的文件。在全局命名空间中声明该函数,然后使用 composer 的 files 机制将其添加到您的组合项目中:

//common.php
<?php
function fn() {
  // some code
}

//composer.json
"autoload": {
    "files": ["path/to/common.php"]
}

这将在每个请求中加载您的common.php文件,并使您的帮助函数可用。


5
如果您正在使用 PHP 5.6+,则可以更进一步为您的助手函数定义命名空间。这将避免任何命名冲突 - 您可以在使用它的地方导入该函数,以便仍然可以简单地调用它作为 fn()。在我看来,这比将其添加到全局命名空间要好得多。 - liquorvicar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接