為了理解SWITCH語句為了躲避語句冗長,知道它如何被執行的是非常重要的.SWITCH語句石一行一行 執行的(事實上,是一條語句一條語句).在開始時,沒有代碼被執行.僅僅當一個值於SWITCH表達式的語句的值相同的CASE語句被發現後,PHP繼續執行語句直到SWITCH體的結束,或者出現了BREAK語句.如果你在一個分支語句的後面沒有寫BREAK語句,PHP將繼續執行下面分支的語句.例如: /* example 3 */ switch ($i) { case 0: print "i equals 0"; case 1: print "i equals 1"; case 2: print "i equals 2"; } 這裡,如果$i等於0,PHP將會執行所有打印語句.如果$i等於1,PHP將會執行剩下的兩個打印語句,並且僅僅當$i等於2的時候,你才能得到你期望的執行結果,只有’I equals 2’被顯示.因此不要在每一個分支語句的後面忘記BREAK語句(即使你在一定的環境下有可能想避免提供他們). 一個特殊的分支是默認的分支.這個分支可以匹配任何其它分支沒有匹配的事情.例如: /* example 4 */ switch ($i) { case 0: print "i equals 0"; break; case 1: print "i equals 1"; break; case 2: print "i equals 2"; break; default: print "i is not equal to 0, 1 or 2"; } 另外一個值得一提的事實是CASE表達式可以是任何計算標量類型的表達式,也就是說,整型或實型和字符型.數組和對象將不會導致PHP崩潰,但是他們沒有沒有任何意義. REQUIRE REQUIRE語句使用指定的文件來代替它自己,與C語言中的#include語句非常相似。這意味著你不能把一個require()語句放在一個循環體中,並且期望它在每一次反復中都包含不同文件的內容.為了達到這個目的,可以使用INCLUDE語句。 require (header.inc); INCLUDE INCLUDE語句包括和計算指定文件. 在每次遭遇INCLUDE語句的時候都會進行一次.因此你可以在一個循環體中使用INCLUDE語句.以用來包含一些不同的文件. $files = array (first.inc, second.inc, third.inc); for ($i = 0; $i < count($files); $i++) { include($files[$i]); } INCLUDE()與REQUIRE()語句是不同的,include語句是每一次都重新計算(並且僅僅當它被執行的時候),而require()語句當他第一次被碰到的時候,用指定的文件來代替它本身,無論這個文件的內容是否被計算(例如,如果它出現在一個條件為FALSE的if語句中). 因為include()是一個特殊的語言結構,你必須在一個語法塊中封閉它,如果它在一個條件塊中. /*錯誤,不會同設想一樣工作. */ if ($condition) include($file); else include($other); /*下面是正確的. */ if ($condition) { include($file); } else { include($other); } 當一個文件被計算的時候,語法分析將處在”HTML-模式”中,這個模式將輸出這個文件的內容直到第一個PHP開始標簽()被遇到. 參考 readfile(),virtual(). 函數 一個function(函數)可以使用如下語法來定義 function foo ($arg_1, $arg_2, ..., $arg_n) { echo "Example function. "; return $retval; } 任何有效的PHP代碼可以出現在function(函數)中,即使是其它的函數或類定義. Function必須在他們被引用之前定義. 返回值 使用一些可選的返回語句,任何類型的數值都能被返回,包括對象和廣義表. function my_sqrt ($num) { return $num * $num; } echo my_sqrt (4); // 輸出 16. 可以返回多值,但是同時的影響使通過一個廣義表來實現: function foo() { return array (0, 1, 2); } list ($zero, $one, $two) = foo(); 參數 通過參數表可以傳遞信息到函數,這個表可以是變量或常量以逗號(,)分隔構成的。 PHP3支持使用值來傳遞變量(默認),通過調用傳遞,和默認的參數值.可變長度的參數列表目前不被支持,但是可以通過傳遞數組來實現. function takes_array($input) { echo "$input[0] + $input[1] = ", $input[0]+$input[1]; } 通過調用傳遞(Passing by reference) 默認的,函數參數通過值來傳遞.如果你希望允許一個函數可以修改它的參數的值,你可以通過調用來傳遞他們. 如果你希望一個函數參數意志通過引用被傳遞,你可以預先函數定義中在參數名前加符號(&): function foo( &$bar ) { $bar .= and something extra.; } $str = This is a string, ; foo ($str); echo $str; // 輸出 This is a string, and something extra. 如果你希望向一個不是用這種方式定義的函數用調用的方式傳遞參數,你可以在函數調用中的參數名稱前加符號(&). function foo ($bar) { $bar .= and something extra.; } $str = This is a string, ; foo ($str); echo $str; //輸出 This is a string, foo (&$str); echo $str; //輸出 This is a string, and something extra. 默認值 一個函數對於標量參數可以定義C++-風格的默認值. function makecoffee ($type = "cappucino") { echo "Making a cup of $type. "; } echo makecoffee (); echo makecoffee ("espresso"); 上面的程序段的輸出如下: Making a cup of cappucino. Making a cup of espresso. 默認值必須是一個常量表達式,不是一個變量或類成員. 注意當時用默認參數時,任何默認都應該在任何非默認參數右邊;否則,事情將不會想你所想的那樣.考慮下面的程序段: function makeyogurt ($type = "acidophilus", $flavour) { return "Making a bowl of $type $flavour. "; } echo makeyogurt ("raspberry"); // 將不會按照預想工作 上面例子的輸出是: Warning: Missing argument 2 in call to makeyogurt() in /usr/local/etc/httpd/htdocs/php3test/functest.html on line 41 Making a bowl of raspberry . 現在,用下面的對比上面的: function makeyogurt ($flavour, $type = "acidophilus"){ return "Making a bowl of $type $flavour. "; } echo makeyogurt (“raspberry”);//正常工作 這個例子的輸出是: Making a bowl of acidophilus raspberry. OLD_FUNCTION OLD_FUNCTION語句允許你聲明一個使用PHP/FI2 的語法的函數(你需要做的就是把’function’替換成’old_function’. 這是一個不被贊成的特征,並且應該僅僅被PHP/FI2到PHP3的轉換這使用. 定義成為OLD_FUNCTION模式的函數不能被PHP的內部代碼調用。其中之一的情況是,意味著您不能在象as usort()、array_walk()和register_shutdown_function().這樣的函數中使用使用他們。您可以使用編寫交換函數的方法來調用OLD_FUNCTION模式的函數(在普通的PHP3表單中)。 CLASS 一個class是一個變量和使用這些變量的函數的組合。定義class使用如下的語法: items[$artnr] += $num; } // Take $num articles of $artnr out of the cart function remove_item ($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return true; } else { return false; } } } ?> 如上所示,定義了一個名字為Cart的class。這個class由多個描寫物品的數組和添加項目、刪除項目的函數組成。 Class是一種類型,這就是說,它是實際變量的設計藍圖。您可以根據設計建立一個變量組和針對它們的一些新的操作。示例如下: $cart = new Cart; $cart->add_item("10", 1); 如上所示,建立了一個類型為class Cart的對象$cart。這個對象中的函數add_item()被調用來添加一個物品號為10的項目。 Class可以使用其他的Class來擴展。這個擴展的或者繼承的class(類)擁有基本class所有的變量和函數同時您還可以在其中加如您自己做的擴展定義。要這樣定義需要使用擴展定義的關鍵詞。 class Named_Cart extends Cart { var $owner; function set_owner ($name) { $this->owner = $name; } } 以上定義了一個名字為Named_Cart的class(類),這個類擁有所有包含於類Cart中的變量和函數,同時還添加了一個變量$owner和函數set_owner()。您可以建立一個有名字的cart,同時獲得cart的擁有者名字。您還可以在類Named_Cart中,使用普通的屬於類cart的函數。 $ncart = new Named_Cart; // Create a named cart $ncart->set_owner ("kris"); // Name that cart print $ncart->owner; // print the cart owners name $ncart->add_item ("10", 1); // (inherited functionality from cart) 在這個類的函數中變量$this表示這個對象。在當前的對象中,您可以使用$this->something來訪問任何變量和函數。 當您建立一個新的類時,有一個構造器函數將被自動的調用。如果某個函數的名字和類的名字一樣,那麼它就成為構造器: class Auto_Cart extends Cart { function Auto_Cart () { $this->add_item ("10", 1); } } 在上面的例子中,定義了一個名字為Auto_Cart的類,它是在原來的類Cart中加上了一個構造器函數,這個構造器函數初始化了類Cart使用的方法是:在每次建立一個類的時候添加一個物品號為10的一個項目。構造器還可以顯示一些信息,這些信息可以被隨意的挑選,這使他們可以變的十分的有用, class Constructor_Cart { function Constructor_Cart ($item = "10", $num = 1) { $this->add_item ($item, $num); } } // Shop the same old boring stuff $default_cart = new Constructor_Cart; // Shop for real... $different_cart = new Constructor_Cart ("20", 17);