在多个函数中使用相同的大型数组而不是多余的正确方法?

时间:2012-08-27 05:45:16

标签: php global-variables

我没有处理具体情况,所以请考虑更多的一般性问题。如果语言很重要,答案可能更倾向于PHP。

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

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

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

  • 将其声明为全局常量

这个似乎是最直接的,但是我谈过的一些人似乎建议不要使用全局变量。任何见解都将不胜感激。

  • 将其传递给函数

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

  • 让它由函数返回

这是我从未见过的很多东西,但我已经多次使用自己将mysqli_connect()信息传递给多个函数。它工作得很好。这被视为不良做法吗?我应该吮吸它并使用全局常量吗?

我意识到使用全局常量听起来很明显,但我听过(并且读过)不止一个咒语,“如果你宣布全局变量,你做错了”等等。任何人都可以解释为什么会这样吗?

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

4 个答案:

答案 0 :(得分:5)

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

  • 将其声明为全局常量

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

  • 将其传递给函数

如果它们实际不变(在“真实世界”意义上,而不是计算机科学意义上),那么你是对的,传递给函数应该被视为代码杂乱(除非函数应该从“全局”值的知识中抽象出来,但这是一个特定于域的架构选择。

  • 让它由函数返回
丁丁!原因基本上是这样的:任何人都可以访问这些“读取”,但只有“功能”可以“写”。我将“function”放在引号中,因为它也可以是类或单例对象实例。基本上,您提供了此静态信息的语义上合适的提供程序。

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

答案 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 /函数。