PHP 入门 - 2.函数
文章目錄
- 定義函數(shù)
- 嵌套函數(shù)
- 函數(shù)參數(shù)
- 按引用傳遞參數(shù)
- 可變參數(shù)
- 類型提示
- 返回值
- 可變函數(shù)
- 匿名函數(shù)(閉包)
定義函數(shù)
嵌套函數(shù)
PHP 中可以使用嵌套函數(shù),但是其作用有限。內(nèi)部函數(shù)不能自動(dòng)取到外部函數(shù)的參數(shù)。除非外部函數(shù)被調(diào)用,否則內(nèi)部函數(shù)無法被調(diào)用,另外外部函數(shù)代碼被解析后,內(nèi)部函數(shù)也不可以被調(diào)用。如:
function outer ($a) {function inner ($b){echo "there $b";}echo "$a, hello ";inner($a) } inner("reader"); // error! 因?yàn)橥獠亢瘮?shù)還沒有被調(diào)用 outer("well"); // well, hello there well inner("reader"); // there reader outer("well"); // error! 因?yàn)橥獠亢瘮?shù)被調(diào)用時(shí),內(nèi)部函數(shù)被重定義了嵌套函數(shù),是一種有條件的全局函數(shù),你可以控制在什么情況下提供這樣的全局函數(shù)給用戶使用。但也需要注意,過多的全局函數(shù)則會(huì)產(chǎn)生“全局污染”,所以,不可多用。
函數(shù)參數(shù)
按引用傳遞參數(shù)
按引用傳遞參數(shù)允許忽略普通的作用域規(guī)則,可以讓函數(shù)直接訪問和操作參數(shù)變量。使用 & 來標(biāo)識(shí):
function doubler(&$value) {$value = $value << 1; }$a = 3; doubler($a);echo $a;注意:只有變量(非常量)能被聲明為按引用傳遞的參數(shù)。如將上面的例子改成: doubler(10) ,就會(huì)引起錯(cuò)誤。
優(yōu)點(diǎn):按值傳遞時(shí),PHP 必須復(fù)制值。特別時(shí)對大的字符串和對象來說,這將是一個(gè)昂貴的操作。按引用傳遞則不需要復(fù)制值。
缺點(diǎn):操作難度相對較高。
可變參數(shù)
PHP 在用戶自定義函數(shù)中支持可變數(shù)量的傳輸列表。
在 PHP 5.5 以及更早的版本中,PHP提供了三個(gè)函數(shù)用于檢索在函數(shù)中所傳遞的參數(shù)。
- func_get_args() ,返回一個(gè)提供給函數(shù)的所有參數(shù)的數(shù)組。
- func_num_args() ,返回提供給函數(shù)的參數(shù)數(shù)目。
- func_get_arg(argument_number) ,返回一個(gè)來自傳輸?shù)?strong>特定參數(shù)。
在 PHP 5.6 及以上的版本中,由 ... 語法實(shí)現(xiàn)。
訪問變量參數(shù)中使用:
function sum(...$numbers) {$acc = 0;foreach ($numbers as $n) {$acc += $n;}return $acc; }echo sum(1, 2, 3, 4)傳遞過程中使用:
<?php function add($a, $b) {return $a + $b; }echo add(...[1, 2])."\n"; // 3$a = [1, 2]; echo add(...$a); // 3 ?>類型提示
當(dāng)定義一個(gè)函數(shù)時(shí),你可以要求一個(gè)參數(shù)是一個(gè)特定的類,或是繼承自一個(gè)特定的接口的實(shí)例,一個(gè)數(shù)組或者一個(gè)回調(diào)。并在 PHP 7 中增加了對標(biāo)量類型的支持:(bool, float, string, bool)。
// Scalar Type Hints function printRecord(string $name, int $id, float $salary, bool $sex) {echo $sex ? "$name, $id, $salary, male.\n" : "$name, $id, $salary, female. \n"; }printRecord("Tom", 101, 5650.00, TRUE); // Tom, 101, 5650, male. printRecord("Suzy", 101, 5650.00, FALSE); // Suzy, 101, 5650, female.在 PHP 7 中還增加了對函數(shù)返回值的的類型提示(這下徹底支持強(qiáng)類型了)
function mySuperFunction(): int {return "5"; }echo mySuperFunction(); // 5返回值
函數(shù)不能返回多個(gè)值,但可以通過返回一個(gè)數(shù)組來得到類似的效果。
function returnTwo() {return array("Fred", 35); }從函數(shù)返回一個(gè)引用,必須在函數(shù)聲明和指派返回值給一個(gè)變量時(shí)都使用引用運(yùn)算符 & :
$names = array("Fred", "Barney", "Wilma" ,"Betty");function &findOne($n) {global $names;return $names[$n]; }$person =& findOne(1); echo $person, $names[1]; // Barney Barney $person = "Barnetta"; echo $person, $names[1]; // Barnetta Barnetta在 PHP 7 中增加了對返回值類型聲明的支持。
function sum($a, $b): float {return $a + $b; }// Note that a float will be returned. var_dump(sum(1, 2)); // float(3)可變函數(shù)
PHP 支持可變函數(shù)的概念。這意味著如果一個(gè)變量名后有圓括號,PHP 將尋找與變量的值同名的函數(shù),并且嘗試執(zhí)行它。可變函數(shù)可以用來實(shí)現(xiàn)包括回調(diào)函數(shù),函數(shù)表在內(nèi)的一些用途。
function foo() {echo "In foo()<br />\n"; }function bar($arg = '') {echo "In bar(); argument was '$arg'.<br />\n"; }// 使用 echo 的包裝函數(shù) function echoit($string) {echo $string; }$func = 'foo'; $func(); // This calls foo()$func = 'bar'; $func('test'); // This calls bar()$func = 'echoit'; $func('test'); // This calls echoit()如果沒有為這個(gè)變量存在的函數(shù),則代碼執(zhí)行時(shí)會(huì)產(chǎn)生一個(gè)運(yùn)行錯(cuò)誤。可以使用 function_exists() 來確定名為此變量的函數(shù)是否存在 $yesOrNo = function_exists(funcion_name);。
可變函數(shù)不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及類似的語言結(jié)構(gòu)。需要使用自己的包裝函數(shù)來將這些結(jié)構(gòu)用作可變函數(shù)。
匿名函數(shù)(閉包)
有些時(shí)候,一些函數(shù)是局部的和臨時(shí)的。為了反映回調(diào)函數(shù)的短暫特性,允許臨時(shí)創(chuàng)建一個(gè)沒有指定名字的函數(shù):匿名函數(shù)(或也稱為閉包)。
閉包可以從父作用域中繼承變量。 任何此類變量都應(yīng)該用 use 語言結(jié)構(gòu)傳遞進(jìn)去。 PHP 7.1 起,不能傳入此類變量: superglobals、 $this 或者和參數(shù)重名。
$array = array("really long string here, body", "this", "middling length", "larger"); $sortOption = "random";function sortNonrandom($array) {$sortOption = false;usort($array, function($a, $b) use ($sortOption){if ($sortOption == "random"){// 通過隨機(jī)返回( -1, 0, 1)進(jìn)行隨機(jī)排序return rand(0,2) - 1;}else{// 按照字符長度驚喜排序return strlen($a) - strlen($b);}});print_r($array); } print_r(sortNonrandom($array)); // 正常排序PHP 文檔中的一個(gè)例子,從父作用域繼承變量:
$message = 'hello';// 沒有 "use" $example = function () {var_dump($message); }; echo $example(); // 輸出如下 // Notice: Undefined variable: message in phpfile on line 6 // NULL// 繼承 $message $example = function () use ($message) {var_dump($message); }; echo $example(); // string(5) "hello"// 繼承變量的值來自定義函數(shù)時(shí)之前的值,而不是調(diào)用時(shí)的值 $message = 'world'; echo $example(); // string(5) "hello"// 變量更新 $message = 'hello';// 通過引用繼承 $example = function () use (&$message) {var_dump($message); }; echo $example(); // string(5) "hello"// 父作用域中更改的值反映在函數(shù)調(diào)用內(nèi) $message = 'world'; echo $example(); // string(5) "world"// 閉包也可以接受常規(guī)參數(shù) $example = function ($arg) use ($message) {var_dump($arg . ' ' . $message); }; $example("hello"); // string(11) "hello world"感謝你看到了這里。如果文章有錯(cuò)誤,請?jiān)u論指正,謝謝!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的PHP 入门 - 2.函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP 入门 - 1.语言基础
- 下一篇: PHP 入门 - 3.字符串