composer-php - 使用 Composer 自动加载不包含类的文件只是函数
问题描述
我快疯了。
有没有办法使用作曲家的自动加载功能来加载没有(!)类的文件,只包含一个带有函数的命名空间,但是动态的?
想象一下我放入私有作曲家存储库的库中的文件 1 (Foo.php):
namespace Foo;
function a() {
//...
}
和文件 2 再次通过作曲家使用这个库:
require(.../autoload.php);
\Foo\a();
我希望作曲家仅在我从中调用函数等时才生成自动加载功能以加载“Foo.php”。
但我不想将 Foo.php 包装到一个类中。
解决方案
您希望自动加载函数是合乎逻辑的,因为可能不希望被 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 中获得函数加载拦截。
推荐阅读
- azure - 如何使用 Terraform 使用 Log Workspace 实现 Azure Monitoring Alert VM Heartbeat
- java - maven-dependeny-plugin 3.2.0 下载 struts 1.3.8
- vue.js - 如何在 Vue 中使用 v-bind 和 v-on 绑定自定义命名模型?
- python - 测试 Selenium 以登录我的 Twitter:它不允许您检查元素
- r - 在 R 中删除准空行
- winapi - 使用 WinAPI 获取串行通信溢出错误指示
- git - 防止单个文件被 git 提交覆盖
- azure-powershell - PowerShell:在 where-object 中使用变量作为脚本块
- qliksense - 非零数后的零数
- swift - 400 Invalid_request 您无法登录此应用,因为它不符合 Google 的 OAuth 2.0 保护应用安全政策