聊一聊PHP的global

2022-01-24 05:34:06 字數 1515 閱讀 5601

眾所周知,在php的函式中,如果想使用全域性變數,一種是使用超全域性變數$globals,另一種是在函式中使用global關鍵字宣告,使用超全域性變數$globals的方式大家都知道了,今天來好好聊一聊使用global方式來宣告變數。

我們來看如下例子:

$a = 1;

$b = 2;

function test()

test();

當我們執行test()函式時,在記憶體中變數的狀態是什麼樣的呢?如下圖所示

我們宣告了test函式,當呼叫test()函式時,global會在函式中宣告兩個區域性變數$a, $b,並且分別指向全域性變數$a和$b,此時的臨時變數$a和$b相當於全域性變數$a和$b的引用。所以我們在函式中修改區域性變數$a和$b的值就等同於修改了全域性變數的值。

$a = 1;

$b = 2;

function test()

test();

echo $a;

echo '

';echo $b;

瀏覽器上列印輸出:

11

22

上面的**中還使用了unset(),通過echo輸出能輸出全域性變數$a, $b的值,這也說明test()函式裡通過global關鍵字宣告的$a和$b只是區域性變數,unset()只是斷開了區域性變數與全域性變數的引用。

我們來看另一種情況,如果我們在test函式中宣告的變數在全域性變數中並沒有呢?

先說結論:如果在函式中使用global關鍵字宣告的變數在全域性作用域並沒有同名變數,那麼會先建立同名全域性變數,再在函式中建立區域性變數,同時將全域性變數的引用指向區域性變數。

function test() 

echo $a;

echo '

';echo $b;

通過瀏覽器輸出:

11

22

上面的**,我們在test函式中使用global宣告了變數$a, $b,雖然全域性作用域並沒有宣告$a和$b,但是global依然會先建立全域性變數$a和$b,然後在test函式中建立$a, $b,然後把全域性變數的引用指向test函式的區域性變數。所以即使我們在函式中unset了$a和$b,在函式執行完成後我們依然能列印出$a和$b,因為全域性變數中已經存在著兩個變數了。

所以我們最終可以對得出如下結論:

在函式中使用global宣告變數時,會先在全域性作用域查詢是否有同名變數,如果有則將該全域性變數的引用指向使用global宣告的同名區域性變數。如果全域性作用域沒有同名變數,那麼就先建立同名全域性變數,再建立區域性變數,然後把全域性變數的引用指向區域性變數。

聊一聊 Flask 的 jsonify

首先我們來看一段 python from flask import flask,jsonify tasks api v1.0 tasks methods get defget tasks return jsonify if name main true 在這段 裡面,我們看到了今天的主角jsonif...

聊一聊我的二 二

我是乙個二 二一年六月畢業的學軟體技術的大專生 也就是明年畢業 對於任何人來說,這一年裡是充滿挑戰的。可能乙個小小的想法,就會決定未來的走向。二 二 是對於所有人都是複雜的一年,特別是對於我.二 二 一年裡充滿了對於我是充滿悲傷的,疫情爆發,長輩離世,面臨就業問題等等,各種我不敢面對的事情。都出現在...

聊一聊google的Knowledge Graph

它是google用於增強它的搜尋引擎的功能和提高搜尋結果質量的一種技術。在2012年5月16日提出,除了提供基本的與主題相關的鏈結服務之外,它還能結構化與主題相關的資訊。這樣做的目的就是讓使用者無需通過點選多個相關鏈結自己手動去搜尋相關資訊,而是google直接把整合好的結果展示在搜尋頁面,真是太貼...