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

CL2*_*L22 4 php namespaces function global-namespace composer-php

我的要求可能看起来像是糟糕的做法,但是我想知道它是否可行.

我正在使用作曲家自动加载我的课程.在其中一个类文件中,我想定义一个可以在全局命名空间中用作速记的函数.由于作曲家的要求,该类需要被命名空间.

我的问题:有什么方法可以通过微小的改动来实现这个目的吗?

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";
}
Run Code Online (Sandbox Code Playgroud)

index.php文件:

<?php

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

use Jodes\MyClass;

new MyClass();

// Jodes\fn();  // works
// fn();        // doesn't work
Run Code Online (Sandbox Code Playgroud)

composer.json

{
    "name": "jodes/mypackage",
    "autoload": {
        "psr-4" : {
            "Jodes\\" : "src"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管阅读了比我能算的更多的链接,但我已经尝试了所有我能想到的运气.

谢谢

jed*_*ylo 7

首先,如果此函数不是MyClass的一部分,则不应将其放在同一文件中.惯例是将每个类(并且只有该类)放在单独的文件中.

对于像你的fn()那样全局可用的辅助函数,你需要一个单独的文件.在全局命名空间中声明函数,然后使用composer的文件机制添加到您的composer项目:

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

//composer.json
"autoload": {
    "files": ["path/to/common.php"]
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您使用的是PHP 5.6+,则可以更进一步,为您的帮助函数定义命名空间.这样可以避免任何命名冲突 - 您可以在使用它的地方导入该函数,这样您仍然可以将其简单地称为fn().比将其添加到全局命名空间更好的恕我直言. (4认同)