我在我的模块文件中。我想定义一些复杂的变量,以便在整个模块中使用。对于简单的事情,我这样做:
function mymodule_init() {
define('SOME_CONSTANT', 'foo bar');
}
但这不适用于更复杂的结构。以下是我想到的一些想法:
全球:
function mymodule_init() {
$GLOBALS['mymodule_var'] = array('foo' => 'bar');
}
variable_set:
function mymodule_init() {
variable_set('mymodule_var', array('foo' => 'bar'));
}
模块类的属性:
class MyModule {
static $var = array('foo' => 'bar');
}
Variable_set / _get似乎是最“drupal”的方式,但我被吸引到类设置。这有什么缺点吗?还有其他方法吗?
答案 0 :(得分:3)
我没有看到任何存储数组对象的静态值。
对于简单值,drupal方法是将define
放在模块.module
文件的开头。激活模块时会加载此文件,这样就足够了。没有必要把它放在hook_init函数中。
variable_set
将值存储在数据库中,因此不要反复运行它。相反,您可以将它放在hook_install中以定义它们一次。如果可以在管理部分中更改值,则variable_set
很好用,但它不是存储静态变量的最佳选择,因为您需要查询来获取它。
答案 1 :(得分:0)
我认为所有这些方法都有效。我从未以这种方式使用它,但我相信上下文模块(http://drupal.org/project/context)也有自己的API用于在静态缓存中存储变量。您可以查看documentation for the module。
答案 2 :(得分:0)
避免全局变量总是一个好习惯。这样可以让您的选择更容易一些。
如果你对某个课程犯错,你将会编写与D6标准不一致的代码。有很多模块可以做到这一点,但我个人喜欢接近Drupal核心,所以我可以更好地理解它。并且通过相同应用程序以不同样式编写的代码会对生产力和维护产生负面影响。
variable_set()和define()是完全不同的。当您可以预期要更改的信息(变量)时,请使用前者。将后者用于常量。您的要求应明确,以便使用哪一个。
不要过于担心为variable_set / get命中数据库。如果您的软件编写得很好,它几乎不会影响性能。只有当您的应用程序出现严重的性能问题并且您已尝试其他所有操作时,才能实现类似的性能工作。