PHP 變量的類型 、變量的作用域 和 變量引用;

變量的定義:
變量就是計算機的內存單元;

變量的名稱定義:
變量的名稱就是計算機內存單元的名稱 | 指針,也可以理解為內存單元的引用;

變量的書寫方式:
$ + 標識符 = 變量的聲明;


變量的作用域定義:
能夠訪問變量的范圍;

變量的作用域范圍分類:

超全局變量 —— 一般是 PHP 內置的變量;

全局變量—— 在當前 PHP文檔內,函數的外部能夠訪問的變量;在函數內部調用全局變量必須使用 global 關鍵字聲明;

局部變量—— 在函數的內部聲明,只能在本函數的內部訪問,不能在函數的外部,或者嵌套函數的內部訪問的變量;函數的參數也是局部變量;如果需要在函數的外部使用函數內部的變量,同時使用關鍵字 global 申明即可;但是在嵌套函數的內部依然無法使用;同樣在嵌套函數內部用global申明的變量,在外部的包圍函數中也沒有辦法訪問;

靜態變量——一種特殊的局部變量(作用域范圍相似,但是機制不同,非標準的說法;),在函數的內部定義,當函數執行完成已有依然能夠保存變量值的特殊變量;用static 關鍵字聲明;只能夠在函數中訪問;
static 和 global 只能夠使用一個,重復使用也只會保持一個特性;

 

另兩種特殊變量:
引用變量;(這是我自己私人命名的變量,非標準!)——變量的值是另一個變量的引用(變量引用);

可變變量:如果一個變量的值,剛好同另一個變量的標識符相同,那么在這個變量的前面添加一個 $ ,這樣的書寫形式就是可變變量;


變量的引用:一個變量的值是引用的另一個變量,他們指向同一個內存單元;同過 & 實現;


超全局變量實例:
一般在PHP內的預定義變量都是超全局變量,在函數的內外都能夠訪問;

$_COOKIE      #包含setcookie() 設置的所有信息;
$_SESSION     #包含所有的回話信息;
$_POST        #包含用 POST 方法傳遞過來的數據
$_GET         #包含用 GET 方法傳遞過來的數據
#......


全局變量:
在PHP 函數外部定義的變量;

<?php
$str_name  = 'bill';

function get_name (){
    echo $str_name ; # notice:undefined variable
}
?>

在函數內部訪問全局變量的方法;

方法1:
用global 關鍵字申請這個變量;

<?php

$str_name = 'bill';

function show_name (){
 
   global $str_name;

   echo $str_name ;
}

show_name();

#output : bill
?>

備注:
如果在函數內部改變$str_name 的值,那么同樣會影響函數外部的$str_name 的值,因為他們就是同一個變量;

方法2:
把這個變量當做參數傳遞給函數;

<?php
$str_name = 'bill';
function show_name ($a){
  echo $a;
}

show_name($str_name);
#output:bill
?>

備注:
這的$a 同$str_name 是兩個不同的變量,僅僅只是變量的值相同,內部的改變不會影響外部的變量;

方法3:
傳遞變量的引用;

$str_name = 'bill';

function show_name(&$str_inside_name){
  
  echo $str_inside_name.'<br/>';   #=> bill;
  $str_inside_name = 'tom';        #改變變量的值;
  echo $str_inside_name.‘’<br/>‘’;     #=> tom;
}
show_name($str_name);

echo $str_name;  #=>tom

備注:
這里的 $str_name 同 $str_inside_name 其實是同一個變量,只是表示符不同罷了;他們都指向同一個內存空間;


局部變量:

局部變量就是在函數內部定義的變量,在函數的外部和嵌套函數內部都不能夠訪問;

實例:

function show_name(){
  $str_name = 'bill';
  echo $str_name ;  
}

show_name()  #=> bill

echo $str_name;  #NULL;

訪問局部變量的方法;

方法1:

在全局范圍內訪問局部變量的方法;

function show_name (){
  global $str_name;

  $str_name = 'bill';
}

show_name();

echo $str_name ; #=>bill;

在函數的內部用 global 定義;
在函數的內部定義的全局變量,在函數中和全局范圍內可見;

方法2:
在函數的內部訪問嵌套函數的內部變量;

function outside(){
  
  function inside(){
    global $inside_name;
    
    $inside_name = 'inside_name';
  }
  inside();

  global $inside_name;

  echo $inside_name; 

}

outside();  #=> inside_name;

備注;
從上面我們可看出,函數內部不能夠訪問嵌套的函數中的變量;不管是外層的訪問內層的,還是內層的訪問外層的;

函數內部只能夠訪問全局變量和自己內部的變量;


靜態變量
在函數執行完成后不會被銷毀的只能在函數中訪問,在嵌套函數的內部和全局范圍內無法訪問的變量,

實例:

function outside(){
  static $str_name ;

  $str_name = 'bill';  

  function inside(){

    global $str_name;
    $str_name = 'tom';
    echo $str_name; #=> tom
  }

  inside();
  echo $str_name; #=> bill
}

outside()

echo $str_name; #=> tom


可變變量:
變量的標識符是另一變量的變量;
如果一個變量的值,剛好同另一個變量的標識符相同,那么在這個變量的前面添加一個 $ ,這樣的書寫形式就是可變變量;

實例:

$name = 'bill';

$str = 'name';

$$str;   #這就是可變變量,先計算 $str 的結果,在把這個結果結合$字符在計算;

echo $$str #=> 'bill';


變量引用:
實例:

$str_name_1 = 'bill';

$str_name_2 = &$str_name_1; # 這就是變量引用;

$str_name_2 = 'tom'; #修改一個變量的值,會影響另一個變量;
echo $str_name_1.$str_name_2; #=> tomtom

綜述:
變量是計算機內存的外在顯示,通過變量我們能夠操作內存單元;
當我們定義變量的時候,也就定義了變量的使用范圍,也就是作用域范圍,在范圍外,無法訪問范圍內的變量;
一個變量只能夠對應一個內存單元,但是一個內存空間可以有多個變量來指向,通過變量引用來實現;

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容