基本概念
- 定義
一個$作為前綴的標(biāo)識符带欢。 - 特性
變量可以存放任意類型的值糯景。在編譯或運行時沒有變量的類型檢查,可以用其他不同類型的值替換一個變量的值。 - 聲明
不需要用顯示的語法來聲明變量橱赠。變量第一次被賦值時,該變量被創(chuàng)建箫津。設(shè)置變量的值也有聲明變量的功能狭姨。 - 未賦值
變量如果沒有被賦值,則其值為NULL鲤嫡。
變量的變量
- 定義
通過$符號作為前綴送挑,引用變量的值作為新變量的名稱。 - 示例
$foo = "bar";
$$foo = "baz";
則
$baz = "bar";
變量的引用
- 定義
引用就是如何創(chuàng)建變量的別名暖眼。
$blac =& $white;
- 解釋
兩個變量惕耕,任意一個值改變,另一個值也隨之改變诫肠。 - 銷毀
銷毀其中一個變量的值司澎,不影響另一個值。 - 函數(shù)引用
函數(shù)可以通過引用返回值(?)
function &retRef()
{
$var = "PHP";
return $var;
}
$v =& retRef();
變量的作用域
- 定義
變量聲明的位置決定了一個變量的作用域栋豫〖钒玻總計4種類型作用域:局部作用域、全局作用域丧鸯、靜態(tài)作用域和函數(shù)參數(shù)蛤铜。 - 局部作用域
在一個函數(shù)中聲明。僅在函數(shù)內(nèi)部可見丛肢。全局變量不能在函數(shù)內(nèi)部訪問围肥。 - 全局作用域
函數(shù)外部聲明,任意部位訪問蜂怎。函數(shù)內(nèi)部需要先用global關(guān)鍵字聲明后穆刻,才可訪問。
function updateCounter()
{
global $counter;
$counter++;
}
$counter = 10;
updateCounter();
則
$counter = 11;
使用$GLOBALS數(shù)組
function updateCounter()
{
$GLOBALS[counter]++;
}
$counter = 10;
updateCounter();
echo $counter;
11
- 靜態(tài)變量
靜態(tài)變量在一個函數(shù)被多次調(diào)用時杠步,其值不會丟失氢伟,但此變量僅在該函數(shù)內(nèi)可見(與全局變量的區(qū)別)榜轿。
function updateCounter()
{
static $counter = 0;
$counter++;
echo $counter;
}
$counter = 10;
updateCounter();
updateCounter();
echo $counter;
1
2
10
- 函數(shù)參數(shù)
函數(shù)參數(shù)只在函數(shù)內(nèi)部有效。
function greet($name)
{
echo $name;
}
greet("Janet");
輸出:
Janet
垃圾收集
- 符號表
一個變量有兩個部分朵锣,它的名字和它的值谬盐。符號表是一個將變量名映射到內(nèi)存中變量值所在地址的數(shù)組。 - 引用計數(shù)
符號表中的每一個值都有一個引用計數(shù)器猪勇,它的數(shù)值表示獲取那片內(nèi)存的方式的數(shù)目设褐。
當(dāng)一個變量離開作用域颠蕴,如函數(shù)參數(shù)和局部變量到達函數(shù)末尾時泣刹,它的值的引用計數(shù)減1。當(dāng)一個變量在其他內(nèi)存空間被賦值時犀被,舊值的引用計數(shù)減1椅您。當(dāng)引用計數(shù)的值為0時,他的內(nèi)存被釋放寡键。 - 寫時復(fù)制
當(dāng)將一個變量的值復(fù)制到另一個變量時掀泳,PHP沒有為復(fù)制值使用更多的內(nèi)存。相反西轩,它會更新符號表來說明這兩個變量擁有相同的內(nèi)存快员舵。如果后臺修改了任意一個副本,PHP將分配所需的內(nèi)存來進行復(fù)制藕畔。
$worker = array("Fred", 35, "Wilma");
$other = $worker; // 數(shù)組不被復(fù)制
$worker[1] = 36; // 值改變马僻,數(shù)組被復(fù)制
- 手動管理內(nèi)存
如果要查看一個變量是否被設(shè)置甚至是空字符串,可使用isset()注服。
$s1 = isset($name); // $s1是 false
$name = "Fred";
$s2 = isset($name); // $s2是true
使用unset()刪除變量的值韭邓。
$name = "Fred";
unset($name); //$name 是 NULL