【问题标题】:The advantage / disadvantage between global variables and function parameters in PHP?PHP中全局变量和函数参数的优缺点?
【发布时间】:2011-01-14 01:15:42
【问题描述】:

对不起,我是一个初学者,我无法确定这是一个多么好的问题,也许对你们中的某些人来说这听起来很明显。

如果我们的使用下面这两个是一样的,哪个更好?

function doSomething ($var1,$var2,..){
    ...
}

function doSomething (){
    global $var1,$var2,..;
    ...
}

通过我们的使用,我的意思是我知道在第二种情况下,我们还可以更改全局变量的值。但是如果我们不需要这样做,那么编写这个函数的更好方法是什么?传递变量是否比在函数中声明全局变量占用更少的内存?

【问题讨论】:

  • 除了以下答案中给出的不使用“全局”的原因之外,还要考虑代码的可重用性。例如,如果您有一个函数实用程序文件,那么在包含该文件的任何脚本中,您必须确保您的变量命名与这些函数中的全局变量匹配。这可能会出现问题,尤其是对于复杂的脚本。或者,如果你想通过“插入”一个已经存在的函数来重构脚本,那么你需要检查所有脚本的代码,甚至是与函数无关的代码,以确保没有命名冲突。跨度>
  • 我想补充一点,您也可以考虑在函数外部添加全局变量声明,但这仍然是不好的做法,因为其他人可能不知道他们是否正在导入您的代码。他们可能不知道他们正在导入该全局变量并创建另一个具有相同名称的变量,从而覆盖您的原始变量。

标签: php function global-variables performance


【解决方案1】:

内存使用是一个微不足道的问题。更重要的是代码易于遵循并且没有......不可预测的......结果。从这个角度来看,添加全局变量是一个非常糟糕的想法,IMO。

如果您担心内存使用情况,那么要做的是

function doSomething (&$var1, &$var2,..) {
   ...
}

这将通过引用传递变量,而不是在内存中创建它们的新副本。如果在函数执行过程中修改它们,这些修改将在执行返回调用者时反映出来。

但是,请注意,出于记忆的原因,即使这样做也是非常不寻常的。使用引用的通常原因是我上面列出的原因(为调用者修改它们)。要走的路几乎总是简单的

function doSomething ($var1, $var2) {
    ...
}

【讨论】:

  • 这是我遗漏的一点,当我们的代码开始增长时,函数参数有助于了解函数将使用什么。
  • 如果 $var1 和 $var2 是只读变量,它们不会消耗更多的内存。进一步阅读,关于 PHP 变量和参考:derickrethans.nl/talks/phparch-php-variables-article.pdf
  • 这是不正确的,通过引用通常效率较低。说传递参数时创建了值的副本是非常错误的。只有在修改其值时才会创建副本。
【解决方案2】:

避免使用全局变量,而是使用在参数中传递变量的方法。根据程序的大小,性能可能可以忽略不计。

但是,如果您关心性能,这里有一些关于局部变量(在函数中定义的变量)的 global variable performance 的重要注意事项。

  • 增加全局变量的速度是局部变量的 2 倍。
  • 只声明一个全局变量而不在函数中使用它也会减慢速度(与增加局部变量的速度大致相同)。 PHP 可能会检查全局是否存在。

此外,如果全局变量在代码中的其他地方被更改,则会增加使用错误值的风险。

【讨论】:

  • 您的链接和信息非常有用,我希望我也可以将您的链接标记为正确答案。
【解决方案3】:

编写它以获取参数。可维护性远比微优化重要。带参数时,变量不能在意料之外的地方修改。

【讨论】:

    【解决方案4】:

    虽然这不是一个好的做法,但只要你保证全局永远不会被写入,但只读取你将拥有参数的灵活性。

    作为替代方案,您可以传递一个参数(如果它真的与函数一起使用,则可以传递两个参数,如 exp),其余的则在一个选项数组中(有点像 jquery 所做的)。 这样您就不会使用全局变量,具有一定的参数灵活性,并为每个参数明确定义了默认值。

    function get_things($thing_name,$opt= array() {
       if(!isset($opt["order"])) $opt["order"]= 'ASC';
    }
    

    【讨论】:

      【解决方案5】:

      传入参数,避免全局变量。只保留给定情况所需的范围是衡量良好代码设计的标准。你可能想看看 PHP 变量范围...

      http://php.net/manual/en/language.variables.scope.php

      一个极好的资源,其中包含有关最佳实践和内存管理的一些指示。

      【讨论】:

        【解决方案6】:

        从 PHP 4 开始,使用带有大变量的全局变量会显着影响性能。

        在 $data 中包含一个包含二进制地图数据的 3Mb 字符串并运行 10k 次测试,如果该位为 0 或 1 以用于不同的全局使用,则会得到以下时间结果:

        function getBit($pos) {
        global $data;
        $posByte = floor($pos/8); 
        ...
        }
        

        t5位打开:0.05495s,寻道:5.04544s,全部:5.10039s

        function getBit($data) {
         global $_bin_point;
         $pos = $_bin_point; 
         $posByte = floor($pos/8); 
        }
        

        t5位打开:0.03947s,寻道:0.12345s,全部:0.16292s

        function getBit($data, $pos) {
        $posByte = floor($pos/8); 
        ...
        }
        

        t5位打开:0.05179s,寻道:0.08856s,全部:0.14035s

        因此,传递参数比对 >= 3Mb 的变量使用全局要快得多。没有通过传递 $&data 引用进行测试,也没有使用 PHP5 进行测试。

        【讨论】:

          猜你喜欢
          • 2011-10-25
          • 2013-02-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-07
          • 1970-01-01
          • 2010-12-28
          相关资源
          最近更新 更多