php中 GLOBAL 和關鍵字global為什麼會受到靜態變數的影響

時間 2021-05-31 21:11:41

1樓:zjsxwc

global $a;

時會新建乙個指向與外部$a同位址的指標

$GLOBALS['a'] = &$static_a;

時會把外部$a 指標指向 $static_a的內容,拋棄原先的指向

2樓:

多讀讀php手冊,非常多例子

PHP: 變數範圍

PHP: 引用的解釋

PHP: 引用傳遞

PHP: 引用做什麼

變數範圍

變數的範圍即它定義的上下文背景(也就是它的生效範圍)。大部分的

PHP 變數只有乙個單獨的範圍。這個單獨的範圍跨度同樣包含了

include 和 require 引入的檔案。例如:

<?

php$a=1

;include

'b.inc'

;?>

這裡變數 $a 將會在包含檔案

b.inc 中生效。但是,在使用者自定義函式中,乙個區域性函式範圍將被引入。任何用於函式內部的變數按預設情況將被限制在區域性函式範圍內。例如:

<?

php$a=1

;/* global scope */

function

Test

()Test

();?>

這個指令碼不會有任何輸出,因為 echo 語句引用了乙個區域性版本的變數

$a,而且在這個範圍內,它並沒有被賦值。你可能注意到

PHP 的全域性變數和 C 語言有一點點不同,在 C

語言中,全域性變數在函式中自動生效,除非被區域性變數覆蓋。這可能引起一些問題,有些人可能不小心就改變了乙個全域性變數。PHP

中全域性變數在函式中使用時必須宣告為 global。

global 關鍵字

首先,乙個使用 global 的例子:

Example #1 使用 global

<?php

$a = 1;$b = 2;

function Sum()

Sum();

echo $b;?>

以上指令碼的輸出將是「3」。在函式中宣告了全域性變數

$a 和 $b

之後,對任一變數的所有引用都會指向其全域性版本。對於乙個函式能夠宣告的全域性變數的最大個數,PHP 沒有限制。

在全域性範圍內訪問變數的第二個辦法,是用特殊的 PHP 自定義

$GLOBALS 陣列。前面的例子可以寫成:

Example #2 使用 $GLOBALS 替代 global

<?php

$a = 1;

$b = 2;

function

Sum()

Sum();

echo$b;

?>

$GLOBALS

是乙個關聯陣列,每乙個變數為乙個元素,鍵名對應變數名,值對應變數的內容。$GLOBALS

之所以在全域性範圍內存在,是因為 $GLOBALS 是乙個超全域性變數。以下範例顯示了超全域性變數的用處:

Example #3 演示超全域性變數和作用域的例子

<?

phpfunction

test_global

()?>

使用靜態變數

變數範圍的另乙個重要特性是靜態變數(static

variable)。靜態變數僅在區域性函式域中存在,但當程式執行離開此作用域時,其值並不丟失。看看下面的例子:

Example #4 演示需要靜態變數的例子

<?

phpfunction

Test

()?>

本函式沒什麼用處,因為每次呼叫時都會將

$a 的值設為 0 並輸出

0。將變數加一的 $a++

沒有作用,因為一旦退出本函式則變數

$a 就不存在了。要寫乙個不會丟失本次計數值的計數函式,要將變數

$a 定義為靜態的:

Example #5 使用靜態變數的例子

<?php

function test()

?>

現在,變數 $a 僅在第一次呼叫 test() 函式時被初始化,之後每次呼叫 test() 函式都會輸出

$a 的值並加一。

PHP: 賦值運算子

引用賦值

PHP 支援引用賦值,使用「$varamp;$othervar;」語法。引用賦值意味著兩個變數指向了同乙個資料,沒有拷貝任何東西。

Example #1 引用賦值

<?

php$a=3

;$b=&

$a;// $b 是 $a 的引用

print

"$a\n";

// 輸出 3print "$b\n"; // 輸出 3$a=

4;// 修改 $a

print

"$a\n";

// 輸出 4print "$b\n"; // 也輸出 4,因為 $b 是 $a 的引用,因此也被改變?>

C 中,async關鍵字到底起什麼作用?

小墨 async 就把他當成乙個非同步的標誌就好啦。就當做和void 一樣。await 等待非同步 但也可以使用xx.result 獲取 await之後的結果。 pokemon 高階篇 以IL為劍,直指async await 布魯克石 CSDN部落格 可以看看這個,async await 是語法糖,...

C 中mutable關鍵字存在的必要性是什麼?

千月 const宣告是告訴使用者此操作不會改變物件狀態,類似於一種保證。當一些變數不屬於物件狀態時,我們應該也要允許它在const函式中發生改變。舉個簡單的例子,我想統計某個物件介面被呼叫的次數,使用者應該不想const函式被排除吧,mutable不就派上用場了。 YiQiuuu 我的理解是,乙個類...

資料結構的排序中為什麼關鍵字會重複?

James Yin 因為查詢可以有多種策略,比如 查全部 字串匹配 findall 第乙個 最後乙個 stl lower bound upper bound 等等。另外,如果排序演算法不允許重複,那對元素可重複的序列要怎麼排序呢?題主說的唯一匹配,沒理解錯的話應該指map類資料結構,比如二叉查詢樹 ...