composer转储自动加载和动态类



假设我们有一个文件lib/internal/Foo.php,其中有一个类Foo

composer.json相应调整:

"autoload": {
"psr-0": {
"": [
"lib/internal/"
]
}
}

一切都如预期的那样工作,类Foo被正确地找到并包含。

现在,让我们更改一下文件:

<?php
eval( base64_decode('Y2xhc3MgRm9ve30=') );
// 'Y2xhc3MgRm9ve30=' is just a string 'class Foo{}' encoded with base64

一切仍如预期。

现在我们想要提升自动加载器并运行composer dump自动加载命令:

composer dump-autoload --no-dev --classmap-authoritative

显然,找不到类Foo,因为它在vendor/composer/autoload_classmap.php中不存在Composer扫描文件Foo.php,但找不到类,也不将其放入类映射中。

这里有什么解决方案吗?

例如,以某种方式在composer.json中扩展映射,如:'Foo' => 'lib/internal/Foo.php'无论类是否静态存在,它都将被接受。

PS。这是一个真正的项目问题,我有一些文件加密用于许可目的。

您可以在文件中包含默认的类声明,例如:

<?php
if (!isset($dynamicClass)) {
class defaultFoo {}
} else {
eval( base64_decode($dynamicClass) ); // 'Y2xhc3MgRm9ve30='
}

在Magento 1.9等项目中也有类似的解决方案,其中本地类可能看起来与此类似,以便解决共享模块的多个覆盖:

<?php
if (Module::isActive('KnownModule')) {
class BaseEntity extends LibraryKnownModuleEntity {}
} else {
class BaseEntity extends CoreDataEntity {}
}
class localEntity extends BaseEntity {
// ...
}

相关内容

  • 没有找到相关文章

最新更新