我的 index.php 包含文件 strings.php ,用于翻译短语。在 strings.php 中包含基于用户语言的文件: $ lang.php 。此 $ lang.php 文件是从 $ lang.ini 自动生成的,包含单个数组:
<?php $translation = array (
'USER_PROFILE' => 'Uživatelský profil',
'MESSAGES' => 'Zprávy',
'NOTIFICATIONS' => 'Oznámení',
'SETTINGS' => 'Nastavení',
...
strings.php 中的 $ lang.php 中有一个带有静态函数的字符串和全局分配的数组 $ translation :
include_once('cache/'.$lang.'.php');
class Strings {
static public function translate($string) {
global $translation;
...
}
}
但 translate()函数中的 $ translation 在这种情况下返回null。如果我在 index.php 中包含 $ lang.php 它突然有效,但如果我在其他文件中调用 Strings :: translate()函数, $ translation 再次返回null。我不明白这种行为。 (对不起,英文)
答案 0 :(得分:2)
因为包含文件$lang.php
的方式,变量$translation
作为函数中的局部变量而不是global
变量,因为方法Strings::translate()
期望它
我们在聊天中讨论过后,我理解了这个问题,我可以提出两个解决方案:
更改档案$lang.php
:
<?php global $translation = array (
'USER_PROFILE' => 'Uživatelský profil',
...
这样变量$translation
就在全局上下文中创建,一切都按预期工作。
限制变量$translation
的范围。
档案$lang.php
:
<?php return array (
'USER_PROFILE' => 'Uživatelský profil',
...
这样就不会创建变量(既不是本地变量也不是全局变量),这就消除了混淆的来源。
档案strings.php
:
class Strings {
static $translation;
static private function initialize() {
global $lang;
static::$translation = include_once('cache/'.$lang.'.php');
}
static public function translate($string) {
if (! isset(static::$translation)) {
static::initialize();
}
// use static::$translation instead of global $translation
}
}
更好的设计(实际上是正确的设计)是将方法initialize()
设为公开,将$lang
更改为参数,并在确定{的值后立即从代码中调用它{1}}。
档案$lang
:
strings.php