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

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

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

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

要么

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

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

6 Solutions collect form web for “PHP中全局variables和函数参数之间的优缺点?”

内存使用是一个微不足道的问题。 更重要的是,代码容易遵循,没有…不可预测的结果。 从这个angular度来看,添加全局variables是一个非常糟糕的IDEA。

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

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

这将通过引用传递variables,而不是在内存中创build它们的新副本。 如果在执行该function的过程中修改它们,则这些修改将在执行返回给调用者时反映出来。

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

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

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

但是如果你关心性能的话 ,关于局部variables(函数中定义的variables)的全局variables性能需要注意一些关键的事情。

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

而且,全局variables会增加使用错误值的风险,如果它们在代码中的其他地方被更改。

写它来获取参数。 可维护性远比微观优化重要得多。 当你参数,variables不能在意想不到的地方修改。

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

作为替代scheme,你可以传递一个参数(或者两个,如果它真的和函数一起使用,比如exp),剩下的放在一个选项数组中(有点像jquery)。 这样你不使用全局variables,有一些参数的灵活性,并明确定义了每个参数的默认值。

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

传入参数,避免全局。 只保留给定情况所需的范围是衡量代码devise的一个好方法。 你可能想看看PHP的variables范围…

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

一个很好的资源,有一些关于什么是最佳实践和内存pipe理的指针。

从PHP 4开始,使用全局variables和大variables会显着影响性能。

在$ data中有一个带有二进制映射数据的3Mbstring,如果该位为0或1,则运行10ktesting,以得到以下时间结果:

 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

所以,传递参数比使用全局variables> = 3Mb更快。 没有通过$&数据引用进行testing,并没有用PHP5进行testing。

  • 如何修改bash中的函数内的全局variables?
  • 如何从Bashvariables修剪空白?
  • 指向数组/指针消除歧义数组的C指针
  • Node.js永远与环境variables
  • 打印所有全局variables/局部variables?
  • 什么是特殊的美元符号shellvariables?
  • 获取JAX-RS资源中的ServletContext
  • 在PHP中使用带有dynamicvariables名称的大括号
  • 如何检测variables何时改变值
  • self.var和var之间的区别
  • 在Nginx位置规则中使用variables