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