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

Posted

技术标签:

【中文标题】将在自动加载的命名空间类文件中声明的函数转换为全局函数【英文标题】:Make a function that is declared in an autoloaded, namespaced class file, into a global function 【发布时间】:2015-10-29 02:20:35 【问题描述】:

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

我正在使用 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】:

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

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

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


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

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

【讨论】:

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

以上是关于将在自动加载的命名空间类文件中声明的函数转换为全局函数的主要内容,如果未能解决你的问题,请参考以下文章

final,类的自动加载,命名空间

PHP的 Final关键字类(文件)的加载和命名空间

php自动加载带命名空间类的函数

如何从另一个命名空间而不是全局命名空间定义函数和数据?

php使用命名空间时自动加载机制

python中怎样查看已加载的命名空间中所有变量和函数