php文檔知識點整理(函數、方法、文件加載)
函數:
函數定義形式:
function 函數名 (形參1,形參2,.... ){
}
函數參數:(2種)
形參:
1,形參一定是一個變量名!
2,該變量名只能是在該函數中有效的變量名;
3,而且只在該函數調用並執行時有效,函數結束,通常這些變量也就“銷毀”。
實參:
實參就是一個“實際數據”,
該數據可以是一個“直接數據”(比如5,”abc”),也可以是一個變量中存儲的數據。
實參的作用是將其數據“賦值給”形參變量。
實參跟形參之間通常應該有個“一一對應”關系:
定義形式: function 函數名(形參1,形參2,...... ){ 。。。。}
調用形式: 函數名(實參1,實參2,..... )
默認值參數:
註意:
默認值不能是對象或資源類型;
默認值只能是常量表達式,或常量,不能是變量
定義時可以不給定形參,但調用時,卻又可以給定任何個數的實參。
在系統中,var_dump()這個函數也有同樣的使用效果:
var_dump($v1);
var_dump($v1, $v2, $v3); //也可以
這種應用的實現,是依賴與系統中的3個系統函數來達到的:
func_get_args(); //獲得一個函數所接收到的所有實參數據,並結果是一個數組
func_get_arg(n); //獲得一個函數所接收到的第n個實參數據(
func_num_args(); //獲得一個函數所接收到的所有實參數據的個數
定義函數:
function &函數名(形參1,形參2,.....) //註意函數名前有個引用符號“&”
{
$result = 0; //初始化
。。。。。。。
return $result; //此時返回數據,只能是變量
}
匿名函數:
表現1:
$f1 = function(){。。。函數體;};
//這裏的匿名函數定義形式上沒有名字,但其實又將之賦值給了變量$f1
使用時,就跟“可變函數”一樣了:$v1 = $f1();
表現形式2:
調用其他函數2(匿名函數,實參
說明:
1此形式的匿名函數只有定義的函數體(無函數名)
2此形式的匿名函數只能作為其他函數調用時的參數(其他函數通常有特定用處)
3此匿名函數會在調用其他函數的“過程中”被執行。
能夠使用(匿名)函數當作實參的函數,並不多!
其中有一個常見的是:call_user_func_array();
其使用形式為:
call_user_func_array(匿名函數,數組);
含義:
將數組的每一項當作該匿名函數的若幹個實參,傳遞到該匿名函數中,並執行該匿名函數,並可以從該匿名函數中返回數據。
變量的作用域:(4個)
通常說作用域,有2個:
局部作用域:只能在所定義的函數範圍內使用。
全局作用域:在函數的“外部”範圍使用。
——php中,局部和全局作用域是不重疊的
——js中,全局作用域是包括局部作用域的
但還有兩個:
超全局:就是在函數的內部和外部都可以使用。
超全局變量只有系統內部預定義的那幾個,我們不能再程序中創建超全局變量。
靜態局部作用域:其實也是局部,但多一個特征:數據能夠在函數退出後仍然保持不丟失。
局部訪問全局變量的特定語法:
在局部範圍內,使用global關鍵字對全局變量進行一次“聲明”,則就可以使用了:
語法:global $變量名;
實際上,函數中的global 語句,其實是創建了一個跟外部變量同名的局部變量,並通過“引用”的方式指向了外部變量的數據區
1 <?php 2 $v1=10; 3 function f3(){ 4 global $v1; 5 echo "<br />v1 = $v1"; 6 $v2=20; 7 } 8 f3(); 9 ?>舉例
$GLOBALS:
在函數中(局部範圍),使用$GLOBALS超全局數組來引用(使用)全局變量:
$GLOBALS超全局數組的作用是用於存儲所有全局變量的數據:變量名為下標,變量值為對應元素值。
全局訪問局部變量的特定語句:
通過引用傳遞的方式向形參傳遞一個引用實參變量
$v1 = 10;
function f1( &$p1, $p2){ ...... } //$p1是函數的形參,也即就是函數的內部(局部)變量
$v2 = f1( $v1, 10); //此時我們認為$v1就可以使用函數中$p1的值。
使用函數的引用返回形式:見前面引用傳遞的方式返回數據
函數中使用global關鍵字來首次引用一個全局變量,則函數結束後在全局範圍就可以使用該變量了
有關函數的系統函數:
function_exists():判斷某個函數是否被定義過,返回布爾值
if( function_exists(“ func1 “) == false ){
function func1(){。。。。。。};//定義函數
}
func_get_arg(n):獲得一個函數的第n個實參值(n從0開始)
func_get_args():獲得一個函數的所有實參,結果是一個數組
func_num_args():獲得一個函數的所有實參的個數。
有關函數的編程思想:
遞歸思想的一個基本形式是:在一個函數中,有至少一條語句,又會去調用該函數自身。
遞歸思想(遞歸函數)
1,很多問題,用遞歸和遞推都可以解決。
2,有些問題只能用遞歸。
3,如果兩種方法都可以解決,推薦使用遞推——效率高很多!
數組:
php中,數組的下標可以是整數,或字符串。
php中,數組的元素順序不是由下標決定,而是由其“加入”的順序決定。
多維數組的一般語法形式:
$v1 = 數組名[下標][下標][.....]
數組遍歷:
foreach( $arr as [ $key => ] $value ) //$key可以稱為鍵變量,$value可以稱為值變量。
{
//這裏就可以對$key 和 $value 進行所有可能的操作——因為他們就是一個變量
//$key 代表每次取得元素的下標,可能是數字,也可以能是字符串
//$value 代表每次取得元素的值,可能是各種類型。
//此循環結構會從數組的第一項一直遍歷循環到最後一項,然後結束。
}
數組指針和遍歷原理:
舉例:$arr1 = array(2=>1, ‘dd’=>5, 1=>1.1, “abc”, 0=>true)
下標: |
2 |
‘dd’ |
1 |
3 |
0 |
值: |
1 |
5 |
1.1 |
‘abc’ |
true |
指針除了負責foreach循環的位置設定之外,還有其他一些函數也依賴於該指針:
1, $v1 = current( $arr1); //取得$arr1中當前指針所指向的元素的值,如果沒有指向元素,則為false
2, $v1 = key($arr1); //取得$arr1中當前指針所指向的元素的下標,。。。。。false
3, $v1 = next($arr1 ); //將指針移向“下一個元素”,然後取得該下一個元素的值;
4, $v1 = prev($arr1); //將指針移向“上一個元素”,然後取得該上一個元素的值
5, $v1 = reset($arr1); //將指針移向“第一個元素”,然後取得該元素的值——數組指針初始化
6, $v1 = end($arr1); //將指針移向“最後一個元素”,然後取得該元素的值
7, $v1 = each($arr1); //取得當前元素的下標和值,然後移動指針到下一個位置。
for+next+reset遍歷數組:
reset( $arr1 ); //重置數組,即:數組指針初始化,這裏,返回的數據被“丟棄”了。
$len = count( $arr1);
for($i = 0; $i < $len $i++){
$key = key ($arr1 ); //下標
$value = current( $arr1 ); //值
//然後這裏就可以對$key 和 $value進行任何作為變量的操作
next($arr1);//這裏,移動指針到下一個元素(也同時丟棄了返回值)
}
while+each()+list()遍歷數組:
each()函數解釋:
each()函數可以取得一個數組中的一個元素的下標和值,然後再放入一個新的數組中,並且指針後移一位。
該新的數組,有4個元素,但存儲的是下標和值的“雙份”,類似下述形式:
array(
1 => 取出來的值,
‘value’ = >取出來的值,
0 = > 取出來的下標(鍵名),
‘key’ => 取出來的下標(鍵名)
);
list()函數解釋:
使用形式:
list($v1, $v2, $v3,$v4 .... )= 數組$arr1;
其作用是:依次取得數組$arr1中下標為0,1,2,3, ....的元素的值,並一次性放入多個變量中(一一對應)
即其相當於如下語句:
$v1 = $arr1[0];
$v2 = $arr1[1];
$v3 = $arr1[2];
$v4 = $arr1[3];
..........
但是註意:只能實現這樣的“從0開始的連續數字下標的元素的取值”(但並非要求數組的元素的順序為同樣的數字順序)
foreach默認是原數組上進行遍歷。但如果在遍歷過程中對數組進行了某種修改或某種指針性操作(就是指前面的指針函數),則會復制數組後在復制的數組上繼續遍歷循環。
1 <?php 2 // $arrpao = array(8,10,26,15,30,13); 3 // $changdu = count($arrpao); 4 // echo "<br>排序之前"; 5 // var_dump($arrpao); 6 // for($i=0;$i<$changdu-1;++$i){ 7 // $max =$arrpao[0]; 8 // $xia =0; 9 // for($k=0;$k<$changdu-$i-1;++$k){ 10 // if($arrpao[$k]>$arrpao[$k+1]){ 11 // $a = $arrpao[$k]; 12 // $arrpao[$k]=$arrpao[$k+1]; 13 // $arrpao[$k+1]=$a; 14 // } 15 // } 16 // } 17 // echo "<br />排序之後:"; 18 // var_dump($arrpao); 19 ?>冒泡案例
文件加載
1.有4個文件加載的語法形式(註意,不是函數):
include , include_once , require , require_once;
1,如果加載文件失敗,則有不同的處理規則;include和require不同
2,如果加載文件重復,則有不同的處理規則;XXX和XXX_once不同;
3,他們都是語法結構,而非函數,使用形式可以有兩種:
3.1 include + ‘文件路徑’; 或者 include + (‘文件路徑’);
文件路徑問題:(有3種)
1.相對路徑
相對路徑就是以“./”, 或“../”,開頭的路徑。
./ 表示當前網頁文件的所在位置(文件夾,目錄);
../ 表示當前網頁文件的所在位置的上一級位置(文件夾,目錄)
/ 表示根目錄文件
這種相對位置對一個網站中的所有內容(包括php,html,圖片,css,js文件)都有效。
2.絕對路徑(2種)
1.本地絕對路徑:
window系統: c:/d1/d2/page3.php
unix系列系統: /d1/d2/page3.php
2.網絡絕對路徑: http://www.abc.com/d1/d2/page4.php
3.只有文件名(無路徑)
1.在php.ini配置文件中,有:include_path設定:
我們也可以在腳本中設定:
設置載入文件:set-include-path(‘文件路徑’)
獲取載入文件:get-include-path(‘文件路徑’)
我們也可以使用另一個函數來獲取當前的include_path的值:
2,上面沒找到,在當前執行的網頁文件所在目錄(所謂當前工作目錄)查找:
所謂當前網頁文件,就是地址欄中顯示的那個文件名。
3,上面還沒找到,則在當前include命令所在文件的所在目錄中查找:
如果一個文件(A)包含文件B,在文件B中又有include命令包含文件C,
此時B中的路徑問題就可能發生這種情況。
文件載入執行過程
1.從include語句處退出php腳本模式(進入html代碼模式)
2.載入include語句所設定的文件中的代碼,並執行之(如同在當前文件中一樣)
3.退出html模式重新進入php腳本模式,繼續之後的代碼
1 <?php 2 echo "<p>代碼(1)</p>" 3 ?> 4 include ‘文件路徑‘ 5 6 <?php 7 echo "<p>代碼(1)</p>" 8 ?>舉例:
四種加載方法的區別:
1.include_once 和include的區別:前者能夠保證不會被重復加載
2.require 和 include的區別:
如果被包含文件不存在,即引用失敗(出錯)時,include發出警告並繼續執行後續代碼,require直接終止。
require_once 和 require的區別:前者能夠保證不會被重復加載。
return關鍵字
return的作用是:結束函數,並可以返回數據;
1 1.<?php 2 echo "<p>主文件中第一行</p>"; 3 4 include‘header2.php‘; 5 6 echo"<p>主文件中第2行</p>"; 7 ?> 8 9 10 2.<?php 11 echo "header2中第一行<br />"; 12 echo "header2中第2行<br />"; 13 return; 14 echo "header2中第3行<br />"; 15 ?>舉例 兩個PHP中
結果:
return返回值的形式:
1.<?php echo "<p>主文件中第一行</p>"; $n = include ‘header2.php‘;//將加載文件執行的結果返回給$n echo "<p>主文件中第2行</p>"; echo "<p>主文件中 n =$n </p>"; ?> 2.<?php $m = 10; echo "header2中第一行<br />"; echo "header2中第2行<br />"; return $m; echo "header2中第3行<br />"; ?>舉例 2個php
結果:
錯誤處理
語法錯誤:
程序沒法運行,直接提示語法錯誤。
運行時錯誤:
只有程序運行到某行,或在某些特定的情形下運行才會發生的錯誤。
邏輯錯誤:
程序從頭到尾運行都沒有發生(並提示)錯誤,但程序運行計算的結果是錯誤的。
我們程序員主要面對的和要處理(應付)的錯誤,就是運行時錯誤。
系統錯誤:
E_ERROR:系統嚴重錯誤
一發生,程序立即停止執行。
該錯誤一般希望馬上。
E_WARNING:系統警告
一發生,提示錯誤,並繼續執行。
通常該錯誤希望能夠在“下一工作日”去處理掉(解決)。
E_PARSE:語法錯誤
一發生,提示錯誤,而且代碼完全不會運行——在運行之前先檢查語法。
E_NOTICE:系統提示
一發生,提示錯誤,並繼續執行。
發個郵件通知一下,自己安排時間有空去解決。
他們的本質是:
1 <?php 2 echo "<br />E_ERROR = ".E_ERROR; 3 echo "<br />E_WARNING = ".E_WARNING; 4 echo "<br />E_PARSE = ".E_PARSE; 5 echo "<br />E_NOTICE = ".E_NOTICE; 6 ?>他們的本質:
可見他們只是一個系統內部常量(整數常量);
用戶自定義錯誤:(3個)
E_USER_ERROR;
E_USER_WARNING;
E_USER_NOTICE;
人工觸發:
trigger_error(“錯誤提示” , 用戶錯誤代號);
錯誤的顯示控制:
設定是否顯示:display_error:
php.ini中;display_error = On; //表示顯示, Off表示不顯示;
php文檔知識點整理(函數、方法、文件加載)