2012-05-24

Java 腦袋學 PHP Function

PHP 是解析完整個檔案後才開始執行,所以 function 的呼叫可以在定義之前。

PHP function 的參數傳遞:
  • 物件參數:Passed by reference
  • 物件以外的參數:Passed by value
誰不是物件:字串、數值、日期以及最容易搞錯的陣列。


強迫物件以外的參數使用 Passed by reference
function aFunc(&$a) { ... }
在變數前加上「&」就可以了,多半用在需要修改傳入的變數,而 function 本身得回傳其他資訊,如執行成功與否。

設定 function 參數的預設值
function aFunc($a, $b = 'b'){ ... }
預設值是用在該參數沒有傳進來時,而不是該參數為空或 NULL 之類的;有預設值設定的參數一定要在沒有預設值設定的參數之後,否則使用上會有問題;預設值得是常數,如數值或字串,不可以是變數。

PHP 的 NULL 是全大寫
function aFunc($a = NULL) {
if (is_null($a) {
return;
}
...
}
使用不定數量參數的 function
function aFunc($array) { ...}

或者

function aFunc() {
$cnt = func_num_args();
$var = func_get_arg(0) ;
}

又或者

function aFunc() {

$vars = func_get_args() ;
$cnt = count($vars);
}
最簡單的方法就是使用關聯陣列,不然就是用 func_num_args 搭配 func_get_arg,或者使用 func_get_args 一次取回所有參數。

使用 by reference 回傳值
function &aFunc($a) {
...
return $big
}
$big =& aFunc($a);
兩個點,第一個在 function name 前面加上「&」,第二個在呼叫時,用「=&」取代原來的「=」;這個奇怪的功能比較可能用在回傳的物件很大很大,若是 return by value 的複製成本會很大,改用 return by reference 比較合理。

回傳多個值
function aFunc() {
...
return array($a, $b, $c);
}
list($a, $b, $c) = aFunc();

或者

list(, , $c) = aFunc();
用陣列回傳,用 list 取得;list 有神奇的用法,可以只取得某幾個變數。

執行失敗
function aFunc() {
....
return false;
}
false 是最不會誤認的常數,只要用「false === $return」一定 ok。

以字串方式呼叫 function
call_user_func('aFunc', $var);

或者

call_user_func_array('aFunc', $array);
call_user_func 適用於單一參數,call_user_func_array 則是多個輸入參數時使用,可以使用 func_get_args 取得傳入的參數。

在 function 裡使用 global 變數
function aFunc() {
global $a;
...
}

或者

function aFunc() {
$a = $GLOBALS['a'];
...
}
這和 Java 很不同,不能直接在 function 裡使用 global 變數,必須在 function 裡使用 global 或者 $GLOBALS 陣列才能取得 global 變數;在 function 裡 unset global 變數是不會影響到真正的 global 變數,只會影響 function 裡的變數,但是若是 unset $GLOBALS['a'] 那就真的會影響到 global 變數了。

沒有留言:

張貼留言