【问题标题】:Autoloading files with composer that contain no classes just functions使用 Composer 自动加载不包含类的文件只是函数
【发布时间】:2019-02-19 00:29:33
【问题描述】:

我快疯了。

有没有办法使用 composer 的自动加载功能来加载一个没有 (!) 类的文件,只包含一个带有函数的命名空间,但是是动态的?

想象一个库中的文件 1 (Foo.php),我将它放入私有作曲家存储库:

namespace Foo;

function a() {
//...
}

和一个文件 2 再次通过 composer 使用这个库:

require(.../autoload.php);

\Foo\a();

我希望作曲家生成自动加载功能,仅当我从中调用函数等时加载“Foo.php”。

但我不想将 Foo.php 包装到一个类中。

【问题讨论】:

  • 并非如此。我希望拥有与类相同的功能:仅在使用 php 文件时才加载它!
  • 目前没有办法在 PHP 中实现函数或常量的自动加载。这是你能得到的最好的。

标签: composer-php autoload


【解决方案1】:

您希望自动加载函数是合乎逻辑的,因为您可能不想受限于 OOP,但自动加载仍然是有效的。

我相信问题在于内置的 PHP 自动加载机制本身。正如@rob006 所说,“没有办法在 PHP 中实现函数或常量的自动加载”,但我想自己看看为什么。

我进行了一些快速测试,发现spl_autoload_register() 函数在调用未知函数时不会调用回调函数。

设置实验:

php > spl_autoload_register(function($class_name){
php (     echo 'Triggered for: '.$class_name;
php ( });

调用命名空间函数不会触发回显:

php > \test\test();
PHP Warning:  Uncaught Error: Call to undefined function test\test() in php shell code:1

调用new 运算符触发回显:

php > $test = new \test\test();
Triggered for: test\test
PHP Warning:  Uncaught Error: Class 'test\test' not found in php shell code:1

调用静态函数触发回显:

php > \asdf\adsf::asdf();
Triggered for: asdf\adsf
PHP Warning:  Uncaught Error: Class 'asdf\adsf' not found in php shell code:1

use 不会触发任何事情:

php > use \test4\test4;

如您所见,在 Composer 中实现会很困难,因为 PHP 中内置的自动加载器不会对加载函数做任何努力。我们能做的最好的事情就是制作一个包含静态函数的包装类。这是我之前所做的,但我想仔细检查是否有真正的解决方案或可以对作曲家本身进行编辑。

我确实发现了这个有趣的面向方面的编程框架,名为GoAOP。它似乎能够拦截函数,但我认为它是通过重写代码来实现的,所以我认为这并不是解决这个问题的理想方案。然而,这是我能找到的唯一拦截函数的方法。

如果我们尝试的话,也许我们可以在 PHP 9 中实现函数加载拦截。

【讨论】:

    猜你喜欢
    • 2022-09-28
    • 2013-04-22
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多