PHP在过程编程中避免全局变量

时间:2019-03-11 05:54:37

标签: php globals procedural

我通常将程序编程与PHP结合使用,并在此处查看其他问题,询问如何避免全局变量,答案通常是使用OOP。通过程序编程是否不可能避免全局变量?

例如,我可以用两种方式编写以下函数。两者都有优点和缺点。如果我经常调用此函数,则第二种方法看起来很肿,因为它每次必须传递所有变量。另一种选择是第一种方法,其中函数仅传递值并且变量都是函数中的全局变量。

doWhatIneedtodo(2);

function doWhatIneedtodo($val) {
  global $this; global $that; global $theother;
  if ($val == 1) { 
    $this++;
  } else
  if ($val == 2) { 
    $that++;
  } else
  if ($val == 3) { 
    $theother++;
  }
}

doWhatIneedtodo(2,$this,$that,$theother);

function doWhatIneedtodo($val,&$this,&$that,&$theother) {
  if ($val == 1) { 
    $this++;
  } else
  if ($val == 2) { 
    $that++;
  } else
  if ($val == 3) { 
    $theother++;
  }
}

或者也许有一种我没有的更好的方法?

2 个答案:

答案 0 :(得分:2)

从麻烦的代码到不太麻烦的代码,这是一个很大的进步:

  • 纯程序性的代码,不使用任何函数:几乎不可能重用或模块化,在任何体面大小的程序中都会迅速导致名称冲突和意大利面条式代码。
  • 使用函数的过程代码:某些变量的命名空间/作用域,但是如果使用全局变量,最终仍然会遇到与上述相同的问题。
  • 具有功能且没有全局变量的过程代码,转向功能编程:没有名称冲突,具有很好的可重用性,但各个值都有很多传递。
  • 在其他语言中,这是结构用来定义值的结构化“捆绑”以在函数之间传递的地方,但是由于PHP缺少结构,因此您将使用数组,这很繁琐因为它们完全是非结构化和无类型的,从长远来看,很难保持其结构的直线性。
  • 因此,对象进入图片,它提供了数据结构。
  • 无论如何,在使用对象时,也可以进行封装,让对象方法对自己的数据起作用,隐藏内部数据结构,而不是公开功能(方法),因此可以更改基础数据结构,并且将更改本地化为类本身,而不是使用所有消耗特定结构/数组的函数。

因此,您看到,用全局过程代码一一解决问题最终还是会导致OOP,至少在PHP中是如此。在途中还可以进行纯函数式编程,但是在PHP方面,纯函数式语言的装备不足。

答案 1 :(得分:0)

对于OOP,您通常会找到有关此问题的答案的原因有两个:

  • 如今,每个人都在进行PHP OOP,这确实值得。
  • 在OOP中,全局变量很糟糕,因为您要避免全局状态。引入全局状态会导致难以测试和维护的代码。在过程PHP中,所有内容都是全局的,因此避免全局的需求就少得多。

除此之外,我更喜欢第二种实现,因为将其转换为正确的OOP代码要容易得多。如果使用第一个实现,并且想要更改变量的名称,则必须调整调用代码和函数本身。