跳轉到內容

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 = "I'm Learning 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_argsfunc_get_arg,而第二個函式使用func_get_args將引數載入到陣列中。它們的輸出將相同。例如

mean(35, 43, 3);

輸出

Mean: 27

返回值

[編輯 | 編輯原始碼]

這個函式很好,但通常您希望您的函式返回一些資訊。通常,程式設計師希望從函式中獲取資訊的原因有兩個:

  1. 函式執行任務,例如計算,我們需要結果。
  2. 函式可以返回值來指示函式是否遇到任何錯誤。

要從函式中返回值,請使用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;
}

注意,沒有elseif之後。這是因為如果$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_funccall_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_funccall_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被執行時,它將函式資訊儲存在記憶體中,並返回函式的名稱。這意味著你無法自定義函式的名稱,雖然這可能是大多數開發人員的偏好。

  1. echo


華夏公益教科書