繁体   English   中英

在PHP中的函数中使用全局变量,就像在Javascript中一样

[英]Using global vars within a function in PHP the way you do it in Javascript

我有一个使用大量全局变量和数组的函数-例如

$a=1;
$b[0]='a';
$b[1]='b';
$c='Hello';

function foo() {
 echo "$a 
       $b[0] 
       $b[1] 
       $c";
}

我知道,与JS相反,调用函数时必须包含var:

function foo($a,$b,$c)

但是由于我在函数中使用了许多不同的var和数组,并且由于大多数var的主要来源是$ _GET数组(在使用extract($ _ GET)之后),所以我不确定如何执行此操作。

有没有办法使PHP函数的行为类似于JS函数?

您应该使用“ global”关键字,它告诉编译器寻找全局变量。

function foo() {
  **global $a, $b, $c;**
 echo "$a 
       $b[0] 
       $b[1] 
       $c";
}

您可以使用global关键字:

$a = "Hello World";
$b = "Hello World";

function outputStrings(){
  global $a, $b;
  echo $a." - ".$b;
}

$b = "Goodbye World";

outputStrings(); // ouputs "Hello World - Goodbye World"

但是,最好不要使用此结构。 它通常令人困惑,并且会使您的代码难以维护。 WordPress在其代码库中大量使用了这种方法,这使得调试非常棘手。 其他插件和代码可以插入和修改全局变量,从而更改脚本的输出。

最好是:

为您的Web应用程序使用OOP结构。

这样,您可以使用对象,而不仅仅是随机全局变量。 解决了您在脚本过程中意外覆盖全局变量的问题。 它还有助于正确组织变量,因此与用户有关的所有变量都可以在User类中。 这样构造它更有意义。

class User {
  private $firstName;
  private $secondName;
  private $gender;

  public function __construct($fname, $sname, $gend){
    $this->firstName = $fname;
    $this->secondName = $sname;
    $this->gender = $gend;
  }

  public function outputDetails(){
    echo $this->firstName." ".$this->secondName." is ".$this->gender;
  } 
}

$user = new User("Thomas", "Clayson", "Male");
$user->outputDetails();

将变量传递给函数

就像您在示例中所示。 这是普遍接受的标准方法。 您应该始终像这样传递变量,它可以帮助您定义范围和适当的结构。 这也意味着您拥有变量并将其传递给函数时就知道变量的值是什么,而不仅仅是从全局范围中抽取变量。

由于在PHP中不必在使用变量之前先声明变量,因此以下代码对于函数所引用的变量是模棱两可的。

$a = 'ten';
function foo($a) {
   echo($a);
}

foo(10); // Outputs: 10

PHP假设函数范围内的所有变量都是局部变量,除非使用函数global关键字将它们声明为来自全局范围,否则PHP消除了歧义。

$a = 10;
function foo($b) {
    global $a;
    echo($a);
}

foo('ten'); // Outputs: 10

通常不建议使用全局变量,因为它会导致对象之间的紧密耦合,降低代码的可读性和局部性,污染全局名称空间并增加开发人员的负担,因为开发人员必须记住他们拥有多少个/什么全局变量。

您可以使用global关键字访问global vars:

global $a=1;
global $b[0]='a';
global $b[1]='b';
global $c='Hello';

function foo() {
  global $a, $b, $c;
  echo "$a 
  $b[0] 
  $b[1] 
  $c";
 }

否则,您可以使用预定义的$GLOBALS数组:

function foo() {
 echo "$GLOBALS['a'] 
 $GLOBALS['b'][0] 
 $GLOBALS['b'][1] 
 $GLOBALS[c]";
}

在这里,您可以获得更多信息:

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

只要有一个函数,PHP 5.3中的上下文管理都不允许在不使用“ global”关键字的情况下访问全局变量。

Php.net在此处有关于该主题的帖子。

function foo() {
    global $a, $b, $c;
    echo "$a 
    $b[0] 
    $b[1] 
    $c";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM