Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/240.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP在过程编程中避免全局变量_Php_Globals_Procedural - Fatal编程技术网

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

PHP在过程编程中避免全局变量,php,globals,procedural,Php,Globals,Procedural,我通常在PHP中使用过程编程,并在这里查看其他问题,询问如何避免全局性,答案通常是使用OOP。是否不可能通过过程编程避免全局性 例如,我可以用两种方法编写以下函数。两者都有优点和缺点。如果我经常调用这个函数,那么第二个方法会让它看起来臃肿不堪,因为它每次都要传递所有变量。另一种方法是第一种方法,其中函数只传递值,变量都是函数中的全局变量 doWhatIneedtodo(2); function doWhatIneedtodo($val) { global $this; global $th

我通常在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++;
  }
}

或者,也许有一种更好的方法可以解决这个问题,但我还没有想到?

对于OOP这个问题,您通常会找到两个答案,我认为:

  • 现在每个人都在做PHP OOP,这真的很值得
  • 在OOP中,全局是不好的,因为您希望避免全局状态。引入全局状态会导致代码更难测试和维护。在过程化PHP中,任何东西都是全局的,因此不需要太多地避免全局的

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

这在很大程度上是一个从麻烦代码到不那么麻烦代码的过程:

  • 纯程序性的不使用函数的代码:几乎不可能重用或模块化,在任何大小合适的程序中都会很快导致名称冲突和意大利面代码
  • 使用函数的过程代码:一些变量的名称空间/作用域,但如果使用全局变量,最终仍会出现与上述相同的问题
  • 过程代码带有函数,而没有全局函数,转向函数式编程:没有名称冲突,可重用性强,但大量传递单个值
  • 在其他语言中,structs将用于定义在函数之间传递的结构化“bundle”值,但由于PHP缺少structs,因此您将使用数组,这是乏味的,因为它们是完全非结构化和非类型化的,并且从长远来看很难保持它们的结构
  • 因此,对象进入图片,提供数据结构
  • 在使用对象的同时,您也可以进行封装,让对象方法对其自己的数据进行操作,隐藏内部数据结构,而不是公开功能(方法),这样就可以更改底层数据结构,并将更改局限于类本身,而不是使用某个结构/数组的所有函数

所以你看,用全局过程代码逐个解决问题最终会导致OOP,至少在PHP中是这样。还有一个岔路口,你也可以使用纯函数式编程,但是PHP不适合成为纯函数式语言。

你有什么实际的理由要避免OOP吗?这是一个功能强大的工具,你应该习惯使用它。@Havenard不,我只是想知道过程编程是否确实有这个限制,或者是否有更好的方法来编写我的函数。这个问题很荒谬,因为顺序代码总是在全局范围内运行。嗯,在某些情况下,您可以将信息分组到
数组中
,而不是为每件事编写单独的全局变量。例如,如果它是从
config.php
加载的,则可以创建一个包含所有内容的关联
$config
数组。应该避免使用全局变量。实际上,你不希望你的脚本依赖于似乎是从黑暗中冒出来的变量,因为它被声明为上帝知道作为一个全局变量,你希望拥有控制权。这就是“告诉,不要问”的原则,它可以帮助您保持代码的安全性和自包含性。作为一个全球性的,但至少是一个全球性的,而不是一打全球性的。