1

我没有要处理的具体情况,因此请将此视为一个一般性问题。如果语言很重要,答案可能更倾向于 PHP。

如果我有多个函数中需要的大型数据数组(或其他数据类型),并且不会改变,我应该如何使用该数据?例如,也许我有一个看起来像的数组

$states = array(
                "AL" => "Alabama",
                     ...
                "WY" => "Wyoming"
                );

显然,这个数组不需要很快改变。如果我有五个必须使用上述数组的函数,最好的解决方案是什么?我的三个想法是:

  • 将其声明为全局常量

这似乎是最直接的,但是我与之交谈过的一些人似乎建议回避使用全局变量。这里的任何见解将不胜感激。

  • 将其传递给函数

这对我来说似乎是个坏主意,因为它永远不会改变,函数参数应该用于变量,对吧?更不用说必须将它传递给一个不使用它的函数,这样它就可以被另一个函数使用。这似乎是一个糟糕的做法。

  • 是否由函数返回

这是我没有看到很多使用的一个,但我已经用自己几次将 mysqli_connect() 信息传递给多个函数。它工作得很好。这是否被视为不良做法?我应该把它吸起来并使用全局常量吗?

我意识到使用全局常量听起来很明显,但我听过(并阅读过)不止一个口头禅,比如“如果你声明全局变量,你做错了”之类的。谁能解释为什么会这样?

感谢您能给我的任何见解,伙计们。

4

4 回答 4

5

我的一般建议是构建一个“服务提供者”类,类似于您的“从函数中返回它”选项。以下是一些具体的想法:

  • 将其声明为全局常量

首先,常量只能是标量值,因此从技术上讲,您不能拥有“常量”数组。其次,您所说的几乎总是正确的:全局变量暗示有更好的方法(有一些例外)。

  • 将其传递给函数

如果它们实际上是恒定的(在“现实世界”意义上,而不是计算机科学意义上),那么您是对的,传递给函数应该被认为是代码混乱(除非函数应该从“ global" 值,但这是特定于域的架构选择。

  • 是否由函数返回

丁丁!原因本质上是这样的:任何人都可以访问这些来“读”,但只有“函数”才能“写”。我将“函数”放在引号中,因为它也可以是类或单例对象实例。基本上,您提供此静态信息的语义适当的提供者。

这种方法的好处之一是您可能只需要在长时间运行的程序中很少使用的数据。在这种情况下,服务提供者可能会被写入从一些内存不足的持久性中获取值,并在不再需要内存时释放内存。没有其他人需要负责该内存管理。同样,假设项目增长,这些数据需要从数据库而不是静态数组加载......如果您有集中访问,这非常容易促进并且您不需要在程序执行的整个过程中,巨大的内存堆存放着几乎从未访问过的值。

于 2012-08-27T05:55:15.333 回答
2

如果您坚持不使用全局变量(这确实是一个坏习惯!),那么您可以将其“隐藏”在函数中:

function get_state($state_code){
  static $states = array(
                "AL" => "Alabama",
                     ...
                "WY" => "Wyoming"
                );
  return $states[$state_code];
} 

但是,在这种情况下,在我看来,使用全局数组就可以了,有点像在 Java 中创建一个 Enam。

于 2012-08-27T05:48:04.467 回答
1

听起来像一个包装类是为了将那些显然相关的函数捆绑在一起:

class CountryHelper {

    protected static $states = array('AL' => ..., ...);

    public function foo() {
        self::$states ...
    }

    public function bar() {
        self::$states ...
    }

}
于 2012-08-27T05:52:50.030 回答
1

这取决于您工作的环境 - 在 MVC 中,我会将其作为控制器的静态属性注入,以便您可以通过以下方式访问它:

 $this -> settings('states')[$state];

否则,我会坚持使用Settings类的静态字段:

 class Settings
 {

      static $states = array( ... );

 }

或者甚至在脚本启动时填充了一个单例,如果需要的话,它可以从其他地方加载设置 [yaml / ini] - 尽管我认为使用单例不是一个好习惯。

无论如何不要走向全球,始终正确命名您的变量/函数。

于 2012-08-27T05:57:20.737 回答