函數(shù)無(wú)需在調(diào)用前被定義,除非是有條件定義的。
PHP中的所有函數(shù)和類(lèi)都具有全局作用域。PHP不支持函數(shù)重載,也不可能取消定義或者重定義已聲明的函數(shù)。
特意試了下,我的電腦上的PHP遞歸棧的最大深度為100。
函數(shù)參數(shù)PHP支持按值傳遞參數(shù)(默認(rèn))、通過(guò)引用傳遞參數(shù)以及默認(rèn)參數(shù)。也支持可變長(zhǎng)度參數(shù)列表。PHP允許使用數(shù)組和特殊類(lèi)型NULL作為默認(rèn)參數(shù)。如果希望允許函數(shù)修改參數(shù)值,必須通過(guò)引用傳遞參數(shù)。
注意!當(dāng)使用默認(rèn)參數(shù)時(shí),任何默認(rèn)參數(shù)必須放在任何非默認(rèn)參數(shù)的右側(cè),否則函數(shù)將不按照預(yù)期工作。
PHP在用戶(hù)自定義函數(shù)中支持可變數(shù)量的參數(shù)列表。在PHP 5.6及以上的版本中,有...語(yǔ)法實(shí)現(xiàn),可以這樣寫(xiě),由于沒(méi)有合適的環(huán)境也無(wú)法測(cè)試。
<?php function sum(...$numbers) {$acc = 0;foreach($numbers as $n) {$acc += $n;}return $acc;}echo sum(1, 2, 3, 4);當(dāng)然在PHP 5.5等低版本中也可以使用可變數(shù)量的參數(shù)列表。通過(guò)函數(shù)func_num_args()、func_get_arg()、gunc_get_args()獲得參數(shù)數(shù)目、某一參數(shù)內(nèi)容、參數(shù)數(shù)組。
<?php function sum() {$acc = 0;foreach(func_get_args() as $n) {$acc += $n;}return $acc;}echo sum(1, 2, 3, 4);返回值函數(shù)不能返回多個(gè)值,但可以通過(guò)返回一個(gè)數(shù)組來(lái)得到類(lèi)似的效果。
<?php function small_numbers() {return array(0, 1, 2);}list($zero, $one, $two) = small_numbers();echo "$zero $one $two";從函數(shù)返回一個(gè)引用,必須在函數(shù)聲明和指派返回值給一個(gè)變量時(shí)都使用引用運(yùn)算符&。
<?php function & return_reference() {return $someref;}$newref = & return_reference();可變函數(shù)PHP支持可變函數(shù),也就是說(shuō),如果一個(gè)變量名后有圓括號(hào),PHP將尋找與變量的值同名的函數(shù),并且嘗試執(zhí)行它。可變函數(shù)可以用來(lái)實(shí)現(xiàn)回調(diào)函數(shù)、函數(shù)表等,雖然這些我都沒(méi)用過(guò)。
當(dāng)調(diào)用靜態(tài)方法時(shí),函數(shù)調(diào)用要比靜態(tài)屬性?xún)?yōu)先。
內(nèi)部函數(shù)PHP有很多標(biāo)準(zhǔn)的函數(shù)和結(jié)構(gòu),還有一些函數(shù)需要和特定的PHP擴(kuò)展模塊一起編譯。
如果傳遞給函數(shù)的參數(shù)類(lèi)型與實(shí)際的類(lèi)型不一致,那么函數(shù)的返回值是不確定的。在這種情況下,通常函數(shù)會(huì)返回NULL。但這僅僅是一個(gè)慣例,并不一定如此。
匿名函數(shù)(Anonymous functions),也叫閉包函數(shù)(closures),允許 臨時(shí)創(chuàng)建一個(gè)沒(méi)有指定名稱(chēng)的函數(shù)。最經(jīng)常用作回調(diào)函數(shù)(callback)參數(shù)的值。
手冊(cè)中的第一個(gè)示例程序是正則表達(dá)式相關(guān)的,不是很了解.第二個(gè)示例程序是一個(gè)匿名函數(shù)變量賦值。注意,匿名函數(shù)變量的定義語(yǔ)句結(jié)尾要加分號(hào)。
<?php $greet = function($name) {echo "Hello $name ";};$greet("world");$greet('PHP');第三個(gè)示例程序,關(guān)于從父作用域繼承變量,也沒(méi)看懂,好遺憾。第四個(gè)示例程序,關(guān)于Closures和作用域,和實(shí)際相結(jié)合,不錯(cuò)的,仔細(xì)看看。
這是一個(gè)基本的購(gòu)物車(chē)類(lèi),實(shí)現(xiàn)了添加某數(shù)量的商品并計(jì)算總價(jià)格的功能。其中使用了一個(gè)closure作為回調(diào)函數(shù)。
<?php class Cart {const PRICE_BUTTER = 1.00;const PRICE_MILK = 3.00;const PRICE_EGGS = 6.95;protected $products = array();public function add($product, $quantity) {$this->products[$product] = $quantity;}public function getQuantity($product) {return isset($this->products[$product]) ? $this->products[$product] : FALSE;}public function getTotal($tax) {$total = 0.00;$callback = function($quantity, $product) use ($tax, &$total) {$pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product));$total += ($pricePerItem * $quantity) * ($tax + 1.0);};array_walk($this->products, $callback);return round($total, 2);}}$mycart = new Cart;$mycart->add('butter', 1);$mycart->add('milk', 3);$mycart->add('eggs', 6);echo $mycart->getTotal(0.05);注意!匿名函數(shù)語(yǔ)句末尾的分號(hào)一定不要落下!
(全文完)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注