PHP 全局變量

 一直認爲PHP的全局變量與C++、Java全局變量相似,直到最近作項目過程當中使用的局變量,才發現須要補充學習下這方面的內容。

  一 全局變量的global的定義和使用

最初,個人需求是這樣的:
<?php
$name = "why";
function changeName(){
    $name = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>

  執行代碼的結果是:my name is why,而不是執行changeName()後顯示what。分析緣由,這是由於函數體changeName內$name變量被缺省設置爲局部變量,$name的做用域就是在changeName內。因而,修改代碼,添加全局變量以下:php

<?php
global $name;
$name = "why";
function changeName(){
    $name = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>

  注意:不能在用global聲明變量的同時給變量賦值。像global $name = "why"的使用方式是錯誤的。函數

  定義全局變量後執行的結果仍然爲my name is why,這個結果讓我吃驚。原來,global的正確用法是:"在一個函數中引入外部的一個變量,若是該變量沒有經過參數傳遞進來,那麼就經過global引入進來。" 也就是說,當一個函數引用一個外部變量時,能夠在函數內經過global來聲明該變量,這樣該變量就能夠在函數中使用了(至關於看成參數傳遞進來)。那麼,再次修改代碼:學習

<?php
$name = "why";
function changeName(){
    global $name;
    $name = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>

  此次的運行結果是:my name is what,說明global是起傳遞參數的做用,而並不是使變量的做用域爲全局。再看下面的例子:spa

<?php
$name = "why";
function changeName(){
    global $name;
    $name = "what";
}
function changeName2(){
    $name = "where";
}
changeName();
changeName2();
echo "my name is " . $name . "<br/>";
?>

  執行結果爲:my name is what,若是在changeName2()中添加global $name,運行結果則是:my name is where。指針

  綜上,global的做用就至關於傳遞參數,在函數外部聲明的變量,若是在函數內想要使用,就用global來聲明該變量,這樣就至關於把該變量傳遞進來了,就能夠引用該變量了。code

  除了使用global參數定義外,還能夠使用超全局變量$GLOBAL:blog

<?php
$name = "why";
function changeName(){
    $GLOBALS['name'] = "what";
}
changeName();
echo "my name is " . $name . "<br/>";
?>

  二 global和$GLOBAL

一個例子:作用域

<?php
$var1 = 1;
$var2 = 2;
function test1(){
    $GLOBALS['var2'] = &$GLOBALS['var1'];
}
test1();
echo $var2 . "<br />";

$var3 = 1;
$var4 = 2;
function test2(){
    global $var3,$var4;
    $var4 = &$var3;
}
test2();
echo $var4 . "<br />";
?>

  輸出$var2的值爲1,$var4的值爲2,由於$var3的引用指向了$var4的引用地址。$var4的實際值並無改變。官方的解釋是:$GLOBALS['var']是外部的全局變量自己,global $var是外部$var的同名引用或者指針。意味着$GLOBAL在一個腳本的所有做用域中均可用,在函數或方法中無需執行global $variable; 就能夠訪問它們。與全部其餘超全局變量不一樣,$GLOBALS在PHP中老是可用的。另外一個例子:io

<?php
$var1 = 1;
function test1(){
    unset($GLOBALS['var1']);
}
test1();
echo $var1 . "<br />";

$var2 = 1;
function test2(){
    global $var2;
    unset($var2);
}
test2();
echo $var2;
?>

  輸出結果是$var1不存在,而$var2的值爲1。這就證實,$var2只是別名引用,自己的值沒有受到任何的改變。也就是說global $var其實就是$var = &$GLOBALS['var'],調用外部變量的一個別名而已function

  這也就證實了爲何在沒給global $var2賦值前,echo該變量,輸出的值是空的

相關文章
相關標籤/搜索