摘要:聲明靜態(tài)變量時(shí)不能用表達(dá)式的結(jié)果對(duì)其賦值正確錯(cuò)誤使用表達(dá)式的結(jié)果賦值錯(cuò)誤使用表達(dá)式的結(jié)果賦值靜態(tài)變量與遞歸函數(shù)靜態(tài)變量提供了一種處理遞歸函數(shù)的方法。
一、變量的定義 1. 變量的命名規(guī)則 變量名可以包含字母、數(shù)字、下劃線,不能以數(shù)字開頭。
$Var_1 = "foo"; // 合法 $var1 = "foo"; // 合法 $_var1 = "foo"; // 合法 $Var-1 = "foo"; // 非法,不能包含 - $1_var = "foo"; // 非法,不能以數(shù)字開頭
在此所說(shuō)的字母是 a-z,A-Z,以及 ASCII 字符從 127 到 255(0x7f-0xff)。
因此實(shí)際上使用中文變量名也是合法的。
甚至使用中文的標(biāo)點(diǎn)符號(hào)作為變量名都是合法的。
只是一般都不推薦這樣用。
$姓名 = "foo"; // 合法 $??!?= "foo"; // 合法。變量名區(qū)分大小寫
$var = "Bob"; $Var = "Joe"; echo "$var, $Var"; // 輸出 "Bob, Joe"$this 是一個(gè)特殊的變量,它不能被賦值
$this = "foo"; // Fatal error: Cannot re-assign $this2. 變量的賦值
變量的引用賦值與傳值賦值詳情傳送門:變量的引用賦值與傳值賦值傳值賦值
變量默認(rèn)總是傳值賦值。那也就是說(shuō),當(dāng)將一個(gè)表達(dá)式的值賦予一個(gè)變量時(shí),整個(gè)原始表達(dá)式的值被賦值到目標(biāo)變量。
這意味著,例如,當(dāng)一個(gè)變量的值賦予另外一個(gè)變量時(shí),改變其中一個(gè)變量的值,將不會(huì)影響到另外一個(gè)變量。
$foo = "Bob"; // 將 "Bob" 賦給 $foo $bar = $foo; // 通過(guò) $foo 傳值賦值給 $bar $bar = "Jack"; // 修改 $bar 變量 echo $foo; // $foo 的值未改變,依然是 "Bob"引用賦值
引用賦值,就是新的變量簡(jiǎn)單的引用(換言之,“成為其別名” 或者 “指向”)了原始變量。
改動(dòng)新的變量將影響到原始變量,反之亦然。
使用引用賦值,只需要將一個(gè) & 符號(hào)加到將要賦值的變量前(源變量)
$foo = "Bob"; // 將 "Bob" 賦給 $foo $bar = &$foo; // 通過(guò) $bar 引用 $foo $bar = "Jack"; // 修改 $bar 變量 echo $foo; // $foo 的值也被修改為 "Jack"
只有有名字的變量才可以引用賦值
$foo = 25; $bar = &$foo; // 合法的賦值 $bar = &(24 * 7); // 非法; 引用沒(méi)有名字的表達(dá)式 function test() { return 25; } $bar = &test(); // 非法3.變量的初始化
雖然在 PHP 中并不需要初始化變量,但對(duì)變量進(jìn)行初始化是個(gè)好習(xí)慣。
未初始化的變量的默認(rèn)值未初始化的變量具有其類型的默認(rèn)值。
布爾類型的變量默認(rèn)值是 FALSE
整形和浮點(diǎn)型變量默認(rèn)值是 0
字符串型變量默認(rèn)值是空字符串 ""
數(shù)組變量的默認(rèn)值是空數(shù)組 array()
4. 可變變量可變變量是指變量的變量名可以動(dòng)態(tài)的設(shè)置和使用。
一個(gè)可變變量獲取了一個(gè)普通變量的值作為這個(gè)可變變量的變量名。在下面的例子中 hello 使用了兩個(gè)美元符號(hào)($)以后,就可以作為一個(gè)可變變量的變量了。
$a = "hello"; $$a = "world";
這時(shí),兩個(gè)變量都被定義了:$a 的內(nèi)容是“hello”并且 $hello 的內(nèi)容是“world”。
因此,以下語(yǔ)句:
echo "$a ${$a}";
與以下語(yǔ)句輸出完全相同的結(jié)果:
echo "$a $hello";
它們都會(huì)輸出:hello world。
可變變量用于數(shù)組要將可變變量用于數(shù)組,必須解決一個(gè)模棱兩可的問(wèn)題。
這就是當(dāng)寫下 $$a[1] 時(shí),解析器需要知道是想要 $a[1] 作為一個(gè)變量呢,還是想要 $ $a 作為一個(gè)變量并取出該變量中索引為 [1] 的值。
解決此問(wèn)題的語(yǔ)法是,對(duì)第一種情況用 ${$a[1]},對(duì)第二種情況用 ${$a}[1]。
類的屬性也可以通過(guò)可變屬性名來(lái)訪問(wèn)??勺儗傩悦麑⒃谠撜{(diào)用所處的范圍內(nèi)被解析。
例如,對(duì)于 $foo->$bar 表達(dá)式,則會(huì)在本地范圍來(lái)解析 $bar 并且其值將被用于 $foo 的屬性名。
對(duì)于 $bar 是數(shù)組單元時(shí)也是一樣。
也可使用花括號(hào){}來(lái)給屬性名清晰定界。
最有用是在屬性位于數(shù)組中,或者屬性名包含有多個(gè)部分或者屬性名包含有非法字符時(shí)(例如來(lái)自 json_decode() 或 SimpleXML)。
將一個(gè)json格式的字符串轉(zhuǎn)換成php對(duì)象:
$string = "{"os-version":"10.3.1","1day":24}"; $obj = json_decode($string); print_r($obj);
輸出結(jié)果:
stdClass Object ( [os-version] => 10.3.1 [1day] => 24 )
此時(shí)若想訪問(wèn)對(duì)象$obj 中的 os-version屬性或1day屬性,若直接使用 $obj->os-version,$obj->1day 訪問(wèn)的話一定會(huì)報(bào)錯(cuò)。
正確的訪問(wèn)方式:
echo $obj->{"os-version"}; echo "
"; echo $obj->{"1day"};
輸出結(jié)果:
10.3.1 24二、變量的作用域和靜態(tài)變量 1. 變量的作用域
變量的作用域也稱變量的范圍,即它定義的上下文背景(也就是它的生效范圍)。
php變量的范圍跨度同樣包含了include和require引入的文件。
在用戶自定義函數(shù)中,將引入一個(gè)局部函數(shù)范圍。任何用于函數(shù)內(nèi)部的變量的作用域都將被限制在局部函數(shù)范圍內(nèi)。例如:
$outer = "str"; /* 全局范圍 */ function myfunc() { echo $outer; /* 對(duì)局部范圍變量的引用 */ } myfunc();
這個(gè)腳本不會(huì)有任何輸出,因?yàn)?echo 語(yǔ)句引用了一個(gè)局部版本的變量 $outer,而且在這個(gè)范圍內(nèi),它并沒(méi)有被賦值。
全局變量global關(guān)鍵字
$outer = "str"; // 全局 function myfunc() { global $outer; echo $outer; // 局部 } myfunc();
這個(gè)腳本會(huì)輸出 str。在函數(shù)中使用global關(guān)鍵字聲明了全局變量 $a 和 $b 之后,對(duì)任一變量的所有引用都會(huì)指向其全局版本。對(duì)于一個(gè)函數(shù)能夠聲明的全局變量的最大個(gè)數(shù),PHP 沒(méi)有限制。
$GLOBALS超全局?jǐn)?shù)組
$GLOBALS — 引用全局作用域中可用的全部變量
$outer = "str"; // 全局 function myfunc() { echo $GLOBALS["outer"]; } myfunc();
這個(gè)腳本會(huì)輸出 str。$GLOBALS 是一個(gè)關(guān)聯(lián)數(shù)組,每一個(gè)變量為一個(gè)元素,鍵名對(duì)應(yīng)變量名,值對(duì)應(yīng)變量的內(nèi)容。$GLOBALS 之所以在全局范圍內(nèi)存在,是因?yàn)?$GLOBALS 是一個(gè)超全局變量。
超全局變量
PHP 中的許多預(yù)定義變量都是“超全局的”,這意味著它們?cè)谝粋€(gè)腳本的全部作用域中都可用。在函數(shù)或方法中無(wú)需執(zhí)行 global $variable; 就可以訪問(wèn)它們。
這些超全局變量是:
$GLOBALS — 超全局變量是在全部作用域中始終可用的內(nèi)置變量
$_SERVER — 服務(wù)器和執(zhí)行環(huán)境信息
$_GET — HTTP GET 變量
$_POST — HTTP POST 變量
$_FILES — HTTP 文件上傳變量
$_COOKIE — HTTP Cookies
$_SESSION — Session 變量
$_REQUEST — HTTP Request 變量。默認(rèn)情況下包含了 $_GET,$_POST 和 $_COOKIE 的數(shù)組。
$_ENV — 環(huán)境變量
變量范圍的另一個(gè)重要特性是靜態(tài)變量(static variable)。
靜態(tài)變量?jī)H在局部函數(shù)域中存在,但當(dāng)程序執(zhí)行離開此作用域時(shí),其值并不會(huì)消失。
1.使用static關(guān)鍵字修飾
2.靜態(tài)聲明是在編譯時(shí)解析的
3.僅初始化一次
4.初始化時(shí)需要賦值
5.每次執(zhí)行函數(shù)該值會(huì)保留
6.static修飾的變量是局部的,僅在函數(shù)內(nèi)部有效
7.可以記錄函數(shù)的調(diào)用次數(shù),從而可以在某些條件下終止遞歸。
function myFunc() { static $a = 1; echo $a++; } myFunc(); // 1 myFunc(); // 2 myFunc(); // 3
變量 $a 僅在第一次調(diào)用 myFunc() 函數(shù)時(shí)被初始化,之后每次調(diào)用 myFunc() 函數(shù)都會(huì)輸出 $a 的值并加1。
聲明靜態(tài)變量時(shí)不能用表達(dá)式的結(jié)果對(duì)其賦值function foo(){ static $int = 0; // 正確 static $int = 1+2; // 錯(cuò)誤 (使用表達(dá)式的結(jié)果賦值) static $int = sqrt(121); // 錯(cuò)誤 (使用表達(dá)式的結(jié)果賦值) echo $int++; }靜態(tài)變量與遞歸函數(shù)
靜態(tài)變量提供了一種處理遞歸函數(shù)的方法。
遞歸函數(shù)是一種調(diào)用自己的函數(shù)。寫遞歸函數(shù)時(shí)要小心,因?yàn)榭赡軙?huì)無(wú)窮遞歸下去。必須確保有充分的方法來(lái)中止遞歸。
以下這個(gè)簡(jiǎn)單的函數(shù)遞歸計(jì)數(shù)到 10,使用靜態(tài)變量 $count 來(lái)判斷何時(shí)停止:
function test() { static $count = 0; $count++; echo $count; if ($count < 10) { test(); } $count--; }3. 實(shí)例分析
寫出如下程序的輸出結(jié)果
$count = 5; function get_count() { static $count; return $count++; } echo $count; ++$count; echo get_count(); echo get_count();第8行 echo $count; 輸出 5 第9行 ++$count;,此時(shí) $count 的值為 6 第11行 echo get_count();,第一次調(diào)用 get_count() 函數(shù)
function get_count() { // 聲明靜態(tài)變量 $count,由于為賦值,所以其值為 NULL static $count; // $count++,先返回 $count 的值,后自增。因此,返回值為 NULL。 // NULL 自增后的值為 1,因此,自增后的 $count = 1 return $count++; }
第一次調(diào)用 get_count() 的返回值為 NULL,而 echo NULL; 什么都不會(huì)輸出。
第12行 echo get_count();,第二次調(diào)用 get_count() 函數(shù)function get_count() { // 第二次調(diào)用時(shí),該行不會(huì)執(zhí)行 static $count; // 此前 $count = 1,$count++,先返回 $count 的值,后自增。因此,返回值為 1。 return $count++; }
第一次調(diào)用 get_count() 的返回值為 1,而 echo get_count(); 輸出 1。
整個(gè)程序的輸出結(jié)果為 51文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/29406.html
摘要:使用中文函數(shù)名和變量名面積長(zhǎng)寬長(zhǎng)寬面積合法,輸出中文符號(hào)函數(shù)名。類型聲明類型聲明允許函數(shù)在調(diào)用時(shí)要求參數(shù)為特定類型。需要使用自己的包裝函數(shù)來(lái)將這些結(jié)構(gòu)用作可變函數(shù)。匿名函數(shù)目前是通過(guò)類來(lái)實(shí)現(xiàn)的。 一、函數(shù)的定義 1. 函數(shù)的命名規(guī)則 函數(shù)名可以包含字母、數(shù)字、下劃線,不能以數(shù)字開頭。 function Func_1(){ } //合法 function func1(){ } //合法 ...
摘要:除法運(yùn)算符總是返回浮點(diǎn)數(shù)。取模運(yùn)算符的結(jié)果和被除數(shù)的符號(hào)正負(fù)號(hào)相同。使用位運(yùn)算符時(shí)要特別注意優(yōu)先級(jí)。太空船運(yùn)算符組合比較符當(dāng)小于等于大于時(shí)分別返回一個(gè)小于等于大于的值。遞增遞減運(yùn)算符不影響布爾值。 一、算術(shù)運(yùn)算符 1. 概覽 例子 名稱 結(jié)果 $a + $b 加法 $a 和 $b 的和。 $a - $b 減法 $a 和 $b 的差。 $a * $b 乘法 $a 和 ...
摘要:支持崩潰后的安全恢復(fù)。的使用場(chǎng)景更新密集的表存儲(chǔ)引擎特別適合處理多重并發(fā)的更新請(qǐng)求。外鍵約束支持外鍵的存儲(chǔ)引擎只有。引擎是及之前版本的默認(rèn)存儲(chǔ)引擎。文件存儲(chǔ)表的索引。引擎存儲(chǔ)引擎是引擎的變種。 MySQL基礎(chǔ)知識(shí)點(diǎn)整理 - 存儲(chǔ)引擎 0. 查看 MySQL 支持的存儲(chǔ)引擎 可以在 mysql 客戶端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...
摘要:魔術(shù)方法知識(shí)點(diǎn)整理代碼使用語(yǔ)法編寫一構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)具有構(gòu)造函數(shù)的類會(huì)在每次創(chuàng)建新對(duì)象時(shí)先調(diào)用此方法,所以非常適合在使用對(duì)象之前做一些初始化工作。在析構(gòu)函數(shù)中調(diào)用將會(huì)中止其余關(guān)閉操作的運(yùn)行。析構(gòu)函數(shù)中拋異常會(huì)導(dǎo)致致命錯(cuò)誤。 PHP魔術(shù)方法知識(shí)點(diǎn)整理 代碼使用PHP7.2語(yǔ)法編寫 一、構(gòu)造函數(shù)和析構(gòu)函數(shù) __construct() 構(gòu)造函數(shù) __construct ([ mi...
閱讀 2965·2023-04-26 00:26
閱讀 3557·2023-04-25 14:30
閱讀 3446·2021-10-09 09:44
閱讀 3736·2021-09-28 09:35
閱讀 1950·2021-09-22 16:02
閱讀 1317·2021-09-03 10:30
閱讀 3278·2019-08-30 15:53
閱讀 2219·2019-08-30 14:07