1. 程式人生 > >【php知識整理】(1)基本語法 & 型別 & 變數 & 常量

【php知識整理】(1)基本語法 & 型別 & 變數 & 常量

第一章 基本語法

1、PHP 標記

<?php echo 'if you want to serve XHTML or XML documents, do like this'; ?>
<script language="php"></script>
<?= expression ?> This is a shortcut for "<? echo expression ?>"
<%= $variable; # This is a shortcut for "<% echo . . ." %> 

上例中的 1 和 2 總是可用的,其中 1 是最常用,並建議使用的。
短標記(上例 3)僅在通過 php.ini 配置檔案中的指令 short_open_tag 開啟後才可用,或者在 PHP 編譯時加入了 –enable-short-tags 選項。
ASP 風格標記(上例 4)僅在通過 php.ini 配置檔案中的指令 asp_tags 開啟後才可用。
儘管有些人覺得短標記和 ASP 風格標記很方便,但移植性較差,通常不推薦。 對輸出大塊的文字而言,脫離 PHP 解析模式通常比將所有內容用 echo() 或者 print() 輸出更有效率。
注: 此外注意如果將 PHP 嵌入到 XML 或 XHTML 中則需要使用

2、指令分隔符

一段 PHP 程式碼中的結束標記隱含表示了一個分號;在一個 PHP 程式碼段中的最後一行可以不用分號結束。如果後面還有新行,則程式碼段的結束標記包含了行結束。
注: 檔案末尾的 PHP 程式碼段結束標記可以不要,有些情況下當使用 include() 或者 require() 時省略掉會更好,這樣不期望的白空格就不會出現在檔案末尾,之後仍然可以輸出響應標頭。在使用輸出緩衝時也很便利,就不會看到由包含檔案生成的不期望的白空格。

3、註釋

PHP 支援 C,C++ 和 Unix Shell 風格(Perl 風格)的註釋。例如:

  echo "This is a test"
; // This is a one-line c++ style comment /* This is a multi line comment yet another line of comment */ echo "One Final Test"; # This is shell-style style comment

第二章 型別

1、四種標量型別:

1.1 boolean(布林型)

當轉換為 boolean 時,以下值被認為是 FALSE:
布林值 FALSE
整型值 0(零)
浮點型值 0.0(零)
空白字串和字串 “0”
沒有成員變數的陣列
沒有單元的物件(僅適用於 PHP 4)
特殊型別 NULL(包括尚未設定的變數)

1.2 integer(整型)

【語法】整型值可以用十進位制,十六進位制或八進位制符號指定,前面可以加上可選的符號(- 或者 +)。 如果用八進位制符號,數字前必須加上 0(零),用十六進位制符號數字前必須加上 0x。
【整數溢位】如果給定的一個數超出了 integer 的範圍,將會被解釋為 float。同樣如果執行的運算結果超出了 integer 範圍,也會返回 float。
【轉換】
用 (int)或(integer)或函式intval()來將一個值轉換成整型。不過大多數情況下不需強制轉換。
從布林值轉換:FALSE 將產生出 0(零),TRUE 將產生出 1(壹)。
從浮點數轉換:當從浮點數轉換成整數時,數字將被取整(丟棄小數位)。
如果浮點數超出了整數範圍,則結果不確定,在此情況下沒有警告,甚至沒有任何通知!
在 Linux 下返回結果是最小負數(-2147483648),而在 Windows 下返回結果是零(0)。

1.3 float(浮點型,也作“double”)

永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精度,應該使用任意精度數學函式或者 gmp 函式。

1.4 string(字串)

可以用三種字面上的方法定義
單引號
雙引號:會解析變數及預定義字元
定界符 :會解析變數及預定義字元

2、兩種複合型別:

2.1 array(陣列)

1、定義陣列:用array()
2、使用 TRUE 作為鍵名將使 integer 1 成為鍵名。使用 FALSE 作為鍵名將使 integer 0 成為鍵名。使用 NULL 作為鍵名將等同於使用空字串。使用空字串作為鍵名將新建(或覆蓋)一個用空字串作為鍵名的值。不能用陣列和物件作為鍵名。
3、應該始終在用字串表示的陣列索引上加上引號。例如用 foo[bar]foo[bar]。這並不意味著總是給鍵名加上引號。用不著給鍵名為常量或變數的加上引號,否則會使 PHP 不能解析它們。
4、E_ERROR 也是個合法的識別符號,下面的例子是合法的:

$error_descriptions[E_ERROR]   = "A fatal error has occured";
$error_descriptions[E_WARNING] = "PHP issued a warning";

5、在雙引號字串中,不給索引加上引號是合法的因此 “$foo[bar]”是合法的。
6、對於任何的型別:整型、浮點、字串、布林和資源,如果將一個值轉換為陣列,將得到一個僅有一個元素的陣列(其下標為 0),該元素即為此標量的值。 如果將一個物件轉換成一個數組,所得到的陣列的元素為該物件的屬性(成員變數),其鍵名為成員變數名。 如果將一個 NULL 值轉換成陣列,將得到一個空陣列。

2.2 object(物件)

物件初始化:要初始化一個物件,用 new 語句將物件例項到一個變數中。
轉換為物件:將一個物件轉換成物件,它將不會有任何變化。如果其它任何型別的值被轉換成物件,內建類 stdClass 的一個例項將被建立。如果該值為 NULL,則新的例項為空。陣列轉換成物件將使鍵名成為屬性名並具有相對應的值。對於任何其它的值,名為 scalar 的成員變數將包含該值。

3、兩種特殊型別:

3.1 resource(資源)

用 is_resource() 函式測定一個變數是否是資源,函式 get_resource_type() 則返回該資源的型別
資源是一種特殊變數,儲存了到外部資源的一個引用。資源是通過專門的函式來建立和使用的。
由於資源型別變數儲存有為開啟檔案、資料庫連線、圖形畫布區域等的特殊控制代碼,因此無法將其它型別的值轉換為資源。
由於 PHP4 Zend 引擎引進了資源計數系統,可以自動檢測到一個資源不再被引用了。這種情況下此資源使用的所有外部資源都會被垃圾回收系統釋放。由此原因,很少需要用某些 free-result 函式來手工釋放記憶體

3.2 NULL

殊的 NULL 值表示一個變數沒有值。NULL 型別唯一可能的值就是 NULL。
在下列情況下一個變數被認為是 NULL:被賦值為 NULL、尚未被賦值、被 unset()

4、偽型別:

4.1 mixed
說明一個引數可以接受多種不同的(但並不必須是所有的)型別。

4.2 number
說明一個引數可以是 integer 或者 float

4.3 callback
回撥函式不僅可以是一個簡單的函式,它還可以是一個物件的方法,包括靜態類的方法

第三章 變數

1、基礎

變數名是區分大小寫的。
一個有效的變數名由字母或者下劃線開頭,後面跟上任意數量的字母,數字,或者下劃線。按照正常的正則表示式,它將被表述為:'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*'。

2、預定義變數

儘管超全域性變數和 HTTP_*_VARS 同時存在。但是他們並不是同一個變數,所以改變一個的值並不會對另一個產生影響。
PHP 4.2.0 以及後續版本中,PHP 指令 register_globals 的預設值為 off。這是 PHP 的一個主要變化,他影響到預定義變數集在全域性範圍內的有效性。例如,為了得到 DOCUMENT_ROOT 的值,將必須使用 SERVER[DOCUMENTROOT]DOCUMENT_ROOT

3、變數範圍

3.1 一般情況

大部分的 PHP 變數只有一個單獨的範圍。這個單獨的範圍跨度同樣包含了 include 和 require 引入的檔案。任何用於函式內部的變數按預設情況將被限制在區域性函式範圍內。

3.2 global關鍵字

在函式中用global申明瞭全域性變數,任何變數的所有引用變數都會指向到全域性變數。對於一個函式能夠申明的全域性變數的最大個數,PHP 沒有限制。
3.3 使用 GLOBALSglobalGLOBALS 陣列中,每一個變數為一個元素,鍵名對應變數名,值對應變數的內容。GLOBALSGLOBALS 是一個超全域性變數。

$a = 1;
$b = 2;
function Sum(){
    $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
Sum();
echo $b;//3

3.4 使用靜態變數

靜態變數僅在區域性函式域中存在,但當程式執行離開此作用域時,其值並不丟失。

function Test(){
    static $a = 0;  //宣告靜態變數時不能使用表示式,如static $a=1+2是錯誤的
    echo $a;
    $a++;
}

每次呼叫 Test() 函式都會輸出 $a 的值並加一

4、可變變數

$a = 'hello';
$$a = 'world';
echo "$a ${$a}";//hello world。
echo "$a $hello";//hello world。

要將可變變數用於陣列,必須解決一個模稜兩可的問題。這就是當寫下

a[1]$a[1]a 作為一個變數並取出該變數中索引為 [1] 的值。解決此問題的語法是,對第一種情況用 $a[1]{$a}[1]。
超級全域性變數不能被用作可變變數。

5、PHP的外部變數

5.1 HTML 表單(GET 和 POST)

magic_quotes_gpc 配置指令影響到 Get,Post 和 Cookie 的值。如果開啟,值 (It’s “PHP!”) 會自動轉換成 (It\’s \”PHP!\”)。資料庫的插入就需要轉義。

5.2 IMAGE SUBMIT 變數名

當提交表單時,可以用一幅影象代替標準的提交按鈕,用類似這樣的標記:

當用戶點選到影象中的某處時,相應的表單會被傳送到伺服器,並加上兩個變數 sub_x 和 sub_y。它們包含了使用者點選影象的座標。有經驗的使用者可能會注意到被瀏覽器傳送的實際變數名包含的是一個點而不是下劃線(即 sub.x 和 sub.y),但 PHP 自動將點轉換成了下劃線。

5.3 HTTP Cookies

在瀏覽器中一個 cookie 會替換掉上一個同名的 cookie,除非路徑或者域不同。因此對於購物車程式可以保留一個計數器並一起傳遞,例如:

if (isset($_COOKIE['count'])) {
    $count = $_COOKIE['count'] + 1;
} else {
    $count = 1;
}
setcookie('count', $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);

5.4 確定變數型別

PHP 包括幾個函式可以判斷變數的型別,例如:gettype(),is_array(),is_float(),is_int(),is_object() 和 is_string()。

第四章 常量

1、語法

常量名和其它任何 PHP 標籤遵循同樣的命名規則。合法的常量名以字母或下劃線開始,後面跟著任何字母,數字或下劃線。用正則表示式是這樣表達的:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
和 superglobals 一樣,常量的範圍是全域性的。不用管作用域就可以在指令碼的任何地方訪問常量。
可以用 define() 函式來定義常量,也可以用該函式檢查是否定義了某常量。
一個常量一旦被定義,就不能再改變或者取消定義。
可以簡單的通過指定其名字來取得常量的值,不要在常量前面加上 $ 符號。如果常量名是動態的,也可以用函式 constant() 來讀取常量的值。用 get_defined_constants() 可以獲得所有已定義的常量列表。

2、 常量和變數不同

1)常量前面沒有美元符號($);
2)常量只能用 define() 函式定義,而不能通過賦值語句;
3)常量可以不用理會變數範圍的規則而在任何地方定義和訪問;
4)常量一旦定義就不能被重新定義或者取消定義;
5)常量的值只能是標量。

3、魔術常量

1)LINE 檔案中的當前行號。
2)FILE 檔案的完整路徑和檔名。如果用在包含檔案中,則返回包含檔名。
3)FUNCTION 返回該函式被定義時的名字(區分大小寫)
4)CLASS 返回該類被定義時的名字(區分大小寫)
5)METHOD 返回該方法被定義時的名字(區分大小寫)。