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

标签 php function namespaces composer-php global-namespace

我的要求可能看起来很糟糕,但我仍然想知道它是否可行。

我正在使用 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"
        }
    }
}

尽管阅读的链接多得我数不过来,但我已经尝试了所有我能想到的方法,但都失败了。

谢谢

最佳答案

首先,如果这个函数不是MyClass的一部分,就不应该放在同一个文件中。约定是将每个类(并且只有那个类)放在单独的文件中。

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

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

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

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

关于php - 将在自动加载的命名空间类文件中声明的函数创建为全局函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31847221/

相关文章:

php - 警告 : Missing Argument 1

php - Vuejs 从 PHP/MySQL 获取请求不起作用

xslt - 如何避免 XSLT 中所有子节点的命名空间声明

datatable - Shiny 的模块命名空间问题 : action buttons in data table

php - 代码不显示 PHP

php - 如何从 PHP 的 DateTime::diff 中获取总天数?

matlab - 如何在向量中获取函数的多个输出?

c++ - 更改函数中的全局变量

c - 调用泛型函数时如何有效处理参数

xslt - XSLT 中的 namespace