PHP 程式設計/函式
函式(或在類/物件上下文中稱為方法)是將常見任務或計算分組以方便重複使用的一種方法。
計算機程式設計中的函式非常像數學函式:您可以向函式提供要處理的值,並獲得結果,而無需自己進行任何計算。
您還可以在 PHP 手冊的函式參考 中找到內置於 PHP 的大量預定義函式列表。
注意,echo不是一個函式。[1] “呼叫函式”意味著在指令碼中的特定點執行特定函式。呼叫函式的基本方法包括
- 呼叫函式以在新行寫入(例如在“;”或“}”之後)
print('I am human, I am.');
- 呼叫函式以在控制語句內部寫入新行
if ($a == 72) {
print('I am human, I am.');
}
- 將函式的返回值分配給一個變數“$var = function()"
$result = sum ($a, 5);
- 在控制語句的引數括號(表示式)內呼叫函式
while ($i < count($one)) {
}
在我們之前的示例中,我們已經呼叫了幾個函式。最常見的是我們呼叫了函式print()來將文字列印到輸出。echo 的引數是我們想要列印的字串(例如print("Hello World!")將“Hello World!” 列印到輸出)。
如果函式返回一些資訊,我們使用簡單的賦值運算子“將它分配給一個變數=":
$var1 = func_name();
引數是僅在該函式記憶體在的變數。它們由程式設計師在呼叫函式時提供,並且函式可以在本地讀取和更改它們(除了全域性更改的引用型別變數,這是一個更高階的主題)。
在宣告或呼叫具有多個引數的函式時,需要使用逗號“將不同引數分隔開,'.
函式宣告可以這樣寫
function print_two_strings($var1, $var2) {
echo $var1;
echo "\n";
echo $var2;
return NULL;
}
要呼叫此函式,您必須為引數提供一個值。值是什麼並不重要,只要有一個值就可以了
print_two_strings("Hello", "World");
輸出
Hello World
在宣告函式時,您有時希望能夠自由地不使用所有引數。因此,PHP 允許您在宣告函式時為它們提供預設值
function print_two_strings($var1 = "Hello World", $var2 = "I'm Learning PHP") {
echo($var1);
echo("\n");
echo($var2);
}
這些值只有在函式呼叫中沒有包含足夠引數時才會使用。如果只提供了一個引數,那麼$var2 = "我正在學習 PHP":
print_two_strings("Hello");
輸出
Hello I'm Learning PHP
另一種獲得動態數量引數的方法是使用 PHP 的內建func_num_args, func_get_args和func_get_arg函式。
function mean() {
$sum = 0;
$param_count = func_num_args();
for ($i = 0; $i < $param_count; $i++) {
$sum += func_get_arg($i);
}
$mean = $sum/$param_count;
echo "Mean: {$mean}";
return NULL;
}
或者
function mean() {
$sum = 0;
$vars = func_get_args();
for ($i = 0; $i < count($vars); $i++) {
$sum += $vars[$i];
}
$mean = $sum/count($vars);
echo "Mean: {$mean}";
return NULL;
}
上面的函式會計算傳遞給它們的所有值的 算術平均值 並輸出它。區別在於第一個函式使用func_num_args和func_get_arg,而第二個函式使用func_get_args將引數載入到陣列中。它們兩個的輸出是相同的。例如
mean(35, 43, 3);
輸出
Mean: 27
這個函式很好,但通常您希望您的函式返回一些資訊。通常,程式設計師希望從函式獲取資訊的原因有兩個
- 該函式執行諸如計算之類的任務,我們需要結果。
- 函式可以返回一個值來指示函式是否遇到任何錯誤。
要從函式返回一個值,請在函式中使用return()語句。
function add_numbers($var1 = 0, $var2 = 0, $var3 = 0) {
$var4 = $var1 + $var2 + $var3;
return $var4;
}
示例 PHP 指令碼
function add_numbers($var1 = 0, $var2 = 0, $var3 = 0) {
$var4 = $var1 + $var2 + $var3;
return $var4;
}
$sum = add_numbers(1, 6, 9);
echo "The result of 1 + 6 + 9 is {$sum}";
結果
The result of 1 + 6 + 9 is 16
請注意,return()語句會結束函式的執行流程。如果在函式宣告中return()語句之後出現任何內容,它會被解析但不會執行。這在某些情況下會很有用。例如
function divide ($dividee, $divider) {
if ($divider == 0) {
// Can't divide by 0.
return false;
}
$result = $dividee/$divider;
return $result;
}
請注意,在else之後沒有if。這是因為,如果$divider確實等於0,則會執行return()語句,並且函式會停止。
如果要返回多個變數,需要返回陣列而不是單個變數。例如
function maths ($input1, $input2) {
$total = ($input1 + $input2);
$difference = ($input1 - $input2);
$return = array("tot" => $total, "diff" => $difference);
return $return;
}
從指令碼中呼叫此函式時,需要將其呼叫到一個數組中。例如
$return = maths(10, 5);
在這種情況下$return['tot']將是總數(例如 15),而$return['diff']將是差值(5)。
開發人員可以在 PHP 指令碼內部建立函式,而無需使用function name($param...) {}語法。這可以透過允許您動態執行函式的程式設計來實現。
有兩種方法可以做到這一點:要麼使用直接呼叫,要麼使用call_user_func或者使用call_user_func_array:
call_user_func和call_user_func_array唯一的區別是call_user_func_array允許您使用第二個引數作為陣列以非常輕鬆地傳遞資料,而call_user_func擁有無限個引數,在專業應用中意義不大。在本例中,我們將使用一個類來拓展示例的應用範圍。
class Some_Class {
function my_function($text1, $text2, $text3) {
$return = $text1 . "\n\n" . $text2 . "\n\n" . $text3;
return $return;
}
}
$my_class = new Some_Class();
使用call_user_func:
$one = "One";
$two = "Two";
$three = "Three";
$callback_func = array(&$my_class, "my_function");
$result = call_user_func($callback_func, $one, $two, $three);
echo $result;
使用call_user_func_array:
$one = "One";
$two = "Two";
$three = "Three";
$callback_func = array(&$my_class, "my_function");
$result = call_user_func_array($callback_func, array($one, $two, $three));
echo $result;
請注意call_user_func和call_user_func_array在兩個示例中都被使用。call_user_func_array允許指令碼更動態地執行函式。
由於之前沒有使用這兩個函式的非類函式示例,因此在這裡給出。
使用call_user_func:
$one = "One";
$two = "Two";
$three = "Three";
$callback_func = "my_function";
$result = call_user_func($callback_func, $one, $two, $three);
echo $result;
使用call_user_func_array:
$one = "One";
$two = "Two";
$three = "Three";
$callback_func = "my_function";
$result = call_user_func_array($callback_func, array($one, $two, $three));
echo $result;
$my_func($param1, $param2);
$my_class_name = new ClassObject();
$my_class_name->$my_func_from_that_class($param1, $param2);
// The -> symbol is a minus sign follow by a "larger than" sign. It allows you to
// use a function that is defined in a different PHP class. It comes directly from
// object-oriented programming. Via a constructor, a function of that class is
// executable. This specific example is a function that returns no values.
call_user_func($my_func, $param1, $param2);
call_user_func(array(&${$my_class_name}, $my_func), $param1, $param2);
// Prefixing a & to a variable that represents a class object allows you to send the
// class object as a reference instead of a copy of the object. In this example this
// means that $my_class_name Object would have a copy made of it, the function will
// act on the copy, and when the function ends. The original object wouldn't suffer
// modifications. Passing an object through its reference passes the address in memory
// where that object is stored and call_user_func will alter the actual object.
call_user_func_array($my_func, array($param1, $param2));
// Most powerful, dynamic example
call_user_func_array(array(&${$my_class_name}, $my_func), array($param1, $param2));
function positif($x + $y;) {
$x = 2;
$y = 5;
$z = $x + $y;
echo $z;
}
positif = $x + $y;
建立執行時函式是使指令碼更動態的非常好的方法。
$function_name = create_function('$one, $two', 'return $one + $two;');
echo $function_name . "\n\n";
echo $function_name("1.5", "2");
create_function建立一個帶有引數的函式$one和$two,以及要執行的程式碼,並返回...當create_function被執行時,它會將函式資訊儲存到記憶體中並返回函式名。這意味著無法自定義函式名,儘管大多數開發人員更喜歡自定義函式名。