我没有处理具体情况,所以请考虑更多的一般性问题。如果语言很重要,答案可能更倾向于PHP。
如果我在多个函数中需要大数据(或其他数据类型)数据,但这不会改变,我应该如何使用该数据?例如,也许我有一个看起来像
的数组$states = array(
"AL" => "Alabama",
...
"WY" => "Wyoming"
);
显然,这个阵列不需要很快改变。如果我有五个必须使用上述数组的函数,那么最佳解决方案是什么?我的三个想法是:
这个似乎是最直接的,但是我谈过的一些人似乎建议不要使用全局变量。任何见解都将不胜感激。
这个对我来说似乎是一个坏主意,因为它永远不会改变,函数参数应该是变量,对吧?更不用说必须将它传递给不使用它的函数,只是因为它可以被另一个函数使用。这似乎是一种糟糕的做法。
这是我从未见过的很多东西,但我已经多次使用自己将mysqli_connect()信息传递给多个函数。它工作得很好。这被视为不良做法吗?我应该吮吸它并使用全局常量吗?
我意识到使用全局常量听起来很明显,但我听过(并且读过)不止一个咒语,“如果你宣布全局变量,你做错了”等等。任何人都可以解释为什么会这样吗?
感谢你能给我的任何见解,伙计们。
答案 0 :(得分:5)
我的一般建议是建立一个“服务提供者”类,类似于“从函数返回”选项。以下是一些具体的想法:
首先,常量只能是标量值,因此技术上不能有“常量”数组。其次,你所说的几乎总是正确的:全局变量暗示有更好的方法(有一些例外)。
如果它们实际不变(在“真实世界”意义上,而不是计算机科学意义上),那么你是对的,传递给函数应该被视为代码杂乱(除非函数应该从“全局”值的知识中抽象出来,但这是一个特定于域的架构选择。
这种方法的一个好处是,在长期运行的程序中,您可能只需要很少的数据。在这种情况下,服务提供者可以被编写以从一些内存不足持久性中获取值,并在不再需要时释放内存。没有其他人需要对内存管理负责。同样,假设项目增长,这些数据需要从数据库而不是静态数组加载......如果你集中访问,这非常容易实现,你不需要在程序执行的整个长度内存在大量内存,其中包含几乎从未访问过的值。
答案 1 :(得分:2)
如果你坚持不使用全局变量(这确实是一个坏习惯!)那么你可以在函数中“隐藏”它:
function get_state($state_code){
static $states = array(
"AL" => "Alabama",
...
"WY" => "Wyoming"
);
return $states[$state_code];
}
但是,在这种情况下,在我看来,使用全局数组会很好,就像在Java中创建一个Enam一样。
答案 2 :(得分:1)
听起来像是一个包装类,它将那些明显相关的函数捆绑在一起:
class CountryHelper {
protected static $states = array('AL' => ..., ...);
public function foo() {
self::$states ...
}
public function bar() {
self::$states ...
}
}
答案 3 :(得分:1)
这取决于您正在使用的环境 - 在MVC中,我会将其作为Controller的静态属性注入,以便您可以通过以下方式访问它:
$this -> settings('states')[$state];
否则,我只会坚持使用Settings
类的静态字段:
class Settings
{
static $states = array( ... );
}
或者甚至在脚本启动时填充单例,如果需要,可以从其他地方加载设置[yaml / ini] - 虽然单身使用在我看来不是一个好习惯。
无论如何不要走向全球,总是正确命名你的vars /函数。