PHP提供了功能強大的函數,但這遠遠滿足不了需要,程式設計師可以根據需要自己建立函數。本節就開始學習建立函數的方法。
我們在實際開發過程當中需要有很多功能都需要重複使用到,而這些反覆需要使用到的功能,我們能定義成功能(函數),就盡可能定義成功能(函數)。使用的時候,吼一下它的名字即可。
那我們來學一下自訂函數的語法規定,語法規定如下:
function 函数名([参数名1[=值1], 参数名2[=值2], 参数名n[=值n]]) { 函数中的功能体 [return 返回值] }
上面的語法規定中發現瞭如下特點,產生如下語未能規定:
1.函數以function開始
2.function後面接空格,空格後接函數名稱
3.函數名稱與變數命名規則基本上一樣,但不同的是:函數名稱不區分大小寫
4.所謂參數其實就是變數
5.函數名後接括號,括號內接參數,參數全都有[](中括號))所有這些都有起來了,代表參數可填可不填
6.如果有參數的話,參數後可以接(=)等號,等號接預設值。參數值也是用[](中括號)括起來的,代表選填
7.函數後的參數變量,主要功能是將函數體外的變量值,傳入函數體內來使用,函數體的變數和函數體外的變數通常是兩個不 同的變數。
8.函數中的特定功能(功能體)用大括號括起來,代表這是一個函數的功能區間
9.函數可以有回傳值也可以沒有回傳值,用[](中括號)括起來的,代表選填。
10.return後接空格,空格後接回傳值,若有return,return後的程式碼皆不執行。
11.函數的執行上沒有順序關係,定義處之前的位置可以呼叫
12.函數不能定義兩次,即函數不能被重載
#記得:你也要多寫程式碼來進行實驗!
我們可以用實驗來一點一點證明這些觀點。
1. 函數是狗,哪裡呼叫哪裡哪,它就跟著你走
<?php function php_cn(){ echo '我是一条狗'; } php_cn(); php_cn(); php_cn(); ?>
php_cn這個函數,是不是顯示出來了三段:我是一隻狗?
2函數名稱只能是字母,數字,底線的組合,且之間不能包含空格,數字不能放在變數名稱首位。
<?php function 1demo(){ } ?>
以上程式碼會報錯誤。函數命名與變數命名
3. 函數名稱與變數命名規則一樣,但不同的是:函數名稱不區分大小寫
<?php function Demo(){ echo '如果是写代码的男人,我们需要更加承担来自家庭的责任<br />'; } demo(); Demo(); DEMO(); ?>
透過上面的程式碼會發現,會顯示出來三行:如果是寫程式碼的男我人我們需要更承擔來自家庭的責任
。
也就是函數名稱在呼叫的時候不區分大小寫。函數可以重複叫它的名字,可以重複執行。也體現了重用的特質。
4. 函數體的參數若是定義了,未傳參數,程式碼會報錯
<?php //定义函数名为test,必须要传入一个参数 function test($hello){ } test(); ?>
你也自己寫一段出來試試,會不會報錯?
5. 函數後的參數如果有預設值,參數可以不填,程式碼也不會報錯
<?php function test( $arg = 10){ echo $arg; } test(); test(88); ?>
是不是沒有報錯呀?並且顯示了 10和出來了。
說明,參數如果傳了,參數會帶入函數中。如果函數沒有傳參數,會用參數後的預設值。
6. 函數後的參數可以寫多個
<?php function test( $a , $b = 20 , $c = 30){ echo $a + $b + $c; } test( 1 , 2 , 3 ); ?>
自己寫寫上面的程式碼,我們是不是傳入了多個參數?
7.函數後面如果有預設值和無預設值的參數,通常把無預設值的參數寫在最前面
之前的第3和第4個實驗我們發現:預設值是代表這個參數可以不用傳值進去。而沒有預設值的話,程式碼會報錯,也就是無預設值的參數是必傳的。我們來看看下面的範例:
<?php function test( $a = 20 , $b = 30 , $c ){ echo $a + $b + $c; } //重点:重点看这一行执行一下 test( , , 8 ); ?>
透過上例發現執行上面的程式碼又報錯了。也就是上面的文法是不行的。
上面的語法我們希望的是,參數$a和參數$b我們不會傳入任何值。參數$c是必須要傳進去的,我們傳了8。可是PHP的文法規定中不準許我們這麼寫。因此,我們換一種寫法,也能達到一樣的效果:
<?php function test( $c , $a = 20 , $b = 30){ echo $a + $b + $c; } //重点:重点看这一行执行一下 test( 8 ); ?>
透過上例實驗大家是不是發現,參數$c我傳了,程式碼還沒報錯。而參數$a = 20 ,參數 $b = 30 一樣帶入了代碼 $a + $b + $c 了。
8. 函數體的變數與函數體外的變數沒有關係
<?php //定义变量$hello的值为10 $hello = 10; //函数后的参数(形式上的参数,参数)处写上变量名为$hello function demo( $hello ){ //形参带入了函数体内,函数体内变量$hello 改为了 250 $hello = 250; //输入2个250相加的结果 echo $hello + $hello; } //将函数体外的变量$hello,传入变量的参数处(实际传入的参数,实参),显示出的结果为500 demo($hello); //此处$hello的值输出,依然为10 echo $hello; ?>
透過上例發現:形參、與實參沒有變點關係。而函數體內的傳進去的形參,再怎麼變化,都不會影響實參$hello的實際結果。
9. 函數體內若有return,return 後的程式碼不執行
<?php function demo(){ echo 111; return; echo 222; } demo(); ?>
發現沒? ——只輸出了111。
10. 函數執行完後,return 可把函數體內的值,帶帶函數體外
<?php //定义一条函数狗 function php_cn(){ $foo = 5; $bar = 6; $result = $foo + $bar; //将$result的结果进行返回 return $result; } //调用php_cn()这个函数,$foo和$bar相加的$result就会返回回来给到变量$piao $piao = php_cn(); //输出$piao的结果,果真为11 echo $piao; ?>
11. 函數的執行沒有順序關係,可以在定義處之前的位置呼叫
<?php demo(); function demo(){ $str = '爸爸妈妈年龄越来越大'; $str .= '大多数的孩子都是独生子女,更加应该负起责任'; echo $str; } demo(); ?>
透過上例發現,函數在定義之前還是在定義之後都可以呼叫。也就是函數可以任意位置呼叫。
11. 函數不能重載
<?php function demo(){ } function demo(){ } //试试会报错吗? ?>
透過上例發現,報錯了,也就是同名函數不能被定義兩次,否則報錯
作業:
1.定義一個雙層循環,隔行變色的表格
2.要求這個表格,預設值為10和10,顏色中有一個為預設參數,一個沒有預設參數
3.將表格的字串return 回去
#
下一節