簡體   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