PHP變數作用域

2021-08-26 12:09:40 字數 2638 閱讀 7502

**: 及 

php是弱型別語言,不必事先宣告變數,再給變數賦值的時候被建立,會自動把變數轉換為正確的資料型別。

php中的變數作用域是指令碼中變數可被引用/使用的範圍,共有四種:global、local、static、parameter。。

一、首先說一下較簡單的static和parameter作用域,我們都知道當乙個函式被呼叫完成後,它的所有的變數都會被刪除,如果想要某個區域性變數不被刪除,那麼可以使用static關鍵字來標識,如下,

<?php

function test()

test(); echo php_eol;

test(); echo php_eol;

test(); echo php_eol;

/*執行指令碼,如下輸出*/

~/******/php/bin/php 01.php

123123

123***********************************==

<?php

function test()

test(); echo php_eol;

test(); echo php_eol;

test(); echo php_eol;

/*加上static進行修飾變數,輸出如下*/

~/******/php/bin/php 01.php

123133

143

二、parameter作用域,引數是放在函式後面的括號「()」中的,是在引數列表中宣告的,作為函式宣告的一部分。

function test01($x)

test01(1); echo php_eol; //輸出1

test01(2); echo php_eol; //輸出2

三、全域性作用域和區域性作用域

在所有的函式外部定義的變數,擁有全域性作用域global,而在函式內部定義的作用域為區域性作用域local,全域性作用域可以被指令碼的任何位置訪問,但是在函式內部反問的話,需要加上global關鍵字或者使用$globals[ ]陣列的形式獲取。

$str = "i am wyao. ";

function teststr()

teststr();

echo $str . php_eol;

echo $str1 . php_eol;

/*執行結果如下*/

~/odp_***x/php/bin/php 01.php

i am wyao. // 函式內第乙個echo

u are mine. // 函式內第二個echo

i am wyao. // 函式外第乙個echo

// 函式外第二個echo

如果不使用global在函式內宣告全域性變數的話,在函式內是無法列印全域性變數的值的。同理,在函式外同樣無法列印函式內的區域性變數,以上例子中,同樣沒有將函式外的$str1這個區域性變數列印出來。注意,使用global $str 和 $globals['str'] 的效果是一樣的,都可以將全域性變數在函式內列印出來,然而這兩個還是有一些不同的,看下面的例子,

$v1 = 1;

$v2 = $v3 = 0;

function testdiff01()

function testdiff02()

testdiff01();

echo 'v1 => ' . $v1 . php_eol; // v1 => sudanhong

echo 'v2 => ' . $v2 . php_eol; // v2 => 0

testdiff02();

echo 'v3 => ' . $v3 . php_eol; // v3 => sudanhong

假如按照我們的正常理解的話,global呼叫的全域性變數v2,那麼v2的值輸出應該為1才對,那麼為什麼這裡的v2輸出仍為0呢?

首先,澄清一下,這裡的v2輸出的仍然是最初定義的全域性變數$v2的值(可以理解為函式中的一頓操作未起作用)。詳細請看

$str = "i am wyao. ";

function teststr()

teststr();

echo $str .php_eol;

/*執行結果輸出*/

~/odp_***x/php/bin/php 01.php

i am wyao.

對於上面的例子來說,我們會產生疑問,我們執行teststr()方法,已經將變數unset掉了,為什麼仍然會列印出來呢,難道unset沒有起作用嗎,恰恰相反,unset已經幫助我們釋放掉了函式中的私有變數(也即是global出來的$str變數),這是由於global會在函式中產生乙個只想函式外變數的別名變數,而它並不是真正的函式外部變數,可以理解為乙個複製品;但是$globals[ ]卻可以實實在在的呼叫外部的變數,函式內外是保持一致的,因此,會出現上面的v2和v3輸出結果。

testdiff01()函式中的$v1,$v2都是區域性變數,只不過是加上了global關鍵字,分別指向了全域性變數$v1,$v2了,當執行$v2 =& $v1;時,區域性變數$v2不再指向全域性變數$v2了,而是指向了全域性變數$v1,也就是說,區域性變數$v2發生了改變,不會在影響到全域性變數$v2,而是會影響到重新指向的全域性變數$v1.

php變數作用域

1 在php中變數主要有 內建超級全域性變數,一般的變數,常量,全域性變數,靜態變數等。內建超級全域性變數 可以在指令碼的任何地方使用和可見。即如果我們在乙個php頁面中改變了其中的乙個值,那麼在其他php頁面中使用時,它的值也會發生改變。常量 一旦被宣告將可以在全域性可見,也就是說,它們可以函式內...

php變數作用域

學過c的人用php的時候一般會相當順手,而且感到php太方便太輕鬆。但在變數作用域這方面卻與 c有不同的地方,搞不好會相當鬱悶,就找不到錯誤所在。昨晚就與到這麼乙個問題,是全域性變數在函式中的問題。今天搜尋了一下,發現一篇相當不錯的文章,講了php中的變數作用域。是一位翻譯的 在這貼一下 變數的範圍...

php變數作用域

先引入官網的一句話 變數的範圍即它定義的上下文背景 也就是它的生效範圍 大部分的 php 變數只有乙個單獨的範圍。這個單獨的範圍跨度同樣包含了 include 和 require 引入的檔案。我理解的就是 php變數只有乙個單獨範圍就是指函式內變數的範圍單獨作用於函式內部,函式外部的變數作用域只在函...