PHP中全局变量和函数参数之间的优缺点?

时间:2010-02-07 07:56:26

标签: php function global-variables performance

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

如果以下这两个我们的使用是相同的哪个更好?

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

OR

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

通过我们的使用我的意思是我知道在第二种情况下我们也可以改变全局变量的值。但是,如果我们不需要这样做,这是编写此功能的更好方法呢?传递变量比在函数中宣布全局变量需要更少的内存吗?

6 个答案:

答案 0 :(得分:22)

内存使用情况令人担忧。更重要的是,代码易于遵循,而不是......不可预测的......结果。从这个角度来看,添加全局变量是一个非常糟糕的想法,IMO。

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

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

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

然而,请注意,出于记忆原因,这是非常不寻常的。使用by-reference的常见原因是我上面列出的原因(为调用者修改它们)。要走的路几乎总是简单的

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

答案 1 :(得分:14)

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

但如果您关注性能,那么关于局部变量(函数中定义的变量),关于global variable performance的一些关键事项需要注意。

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

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

答案 2 :(得分:5)

将其写入参数。可维护性远比微优化重要。获取参数时,无法在意外的位置修改变量。

答案 3 :(得分:2)

虽然这不是一个好的做法,只要你保证全球永远不会写,但只有读过你才会有参与者的灵活性。

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

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

答案 4 :(得分:1)

传递参数,避免全局变量。仅保留给定情况所需的范围是衡量良好代码设计的标准。您可能希望查看PHP变量范围...

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

一个优秀的资源,有一些关于什么是最佳实践和内存管理的指示。

答案 5 :(得分:1)

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

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

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更快。尚未通过传递$&数据参考进行测试,未经过PHP5测试。