假设我们有一个文件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 {
// ...
}