我在我的 ext_tables.php(由扩展生成器构建)中找到了这些行:
<?php
defined('TYPO3_MODE') || die('Access denied.');
call_user_func(
function()
{
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile('rm_navigation', 'Configuration/TypoScript', 'Navigation');
}
);
我使用以下行将 TYPO3 8 的此内容迁移到 Configuration/TCA/Overrides/sys_template.php:
<?php
defined('TYPO3_MODE') || die('Access denied.');
// Extensionregistration
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile('rm_navigation', 'Configuration/TypoScript', 'Navigation');
我读到最好使用 call_user_func 函数来实现此目的,但他/她没有写出原因。
那么:使用 call_user_func 函数更好吗?
并且:为什么这样更好?
特别是对于TYPO3。
谢谢。
这种构造只有一个目的:封装。
每当您在
ext_tables.php
或 ext_localconf.php
中需要临时变量时,您就有可能将该变量泄漏到在您的扩展之后加载的下一个扩展的同一文件中。 PHP 中的闭包作为严格作用域,可防止将变量泄漏到闭包中以及将变量泄漏到周围的代码中。
原因是所有
ext_tables.php
和 ext_localconf.php
文件都连接到一个文件并存储在缓存中。这对于 TCA 和 TCA 覆盖来说没有问题,因为它们在构建整个数组后作为整体存储。
所以在
ext_tables.php
或 ext_localconf.php
中你应该真正使用这个结构。
奖励:在 PHP 7.x 及更高版本中,这可以简化:
(function() {
// ...
})();
在 TYPO3 11 及更早版本中,有可能从
Configuration/TCA/
内部泄漏变量,因为它们可以加载到公共作用域中。闭包通过使变量成为该函数的局部变量来防止这种情况发生。
对于 TYPO3 12.0 及更高版本,范围不再共享,并且不再需要 根据文档。
通常,这些文件中似乎也避免使用声明。旧的 TYPO3 版本可能会遇到问题,但现在这些也是允许的(在
ext_localconf.php
和 ext_tables.php
,too)。
仅需要支持 TYPO3 12.0+ 的代码现在可以如下所示:
// TYPO3_MODE was removed in 12
defined('TYPO3') || die('Access denied.');
// Works fine, too
use \TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
ExtensionManagementUtility::addStaticFile(
'rm_navigation',
'Configuration/TypoScript',
'Navigation',
);