初學 PHP 對於回撥函式的一些理解

ㅤㅤ發表於2018-10-22

談到回撥函式,不得不提匿名函式;匿名函式,也叫閉包函式,也就是沒有名字的函式,它可以單獨存在,也可以將其賦值給某一個變數.
建立一個匿名函式或者叫做閉包函式的時候,要注意最後要加上分號,因為這是一條語句,並不是一個程式碼塊;而平時建立一個普通函式,在最後不需要加分號,因為建立普通函式的結構是一個程式碼塊.可是下面的程式碼看起來就像是一個程式碼塊,實際上並不是(這是為啥呢?).
下面建立一個匿名函式.

<?php
function ($m, $n) {
    return $m + $n;
};

下面建立一個匿名函式,並賦值給某一個變數.

<?php
$add = function ($m, $n) {
    return $m + $n;
};

手冊裡有一個解釋,一些函式如 call_user_func()usort() 可以接受使用者自定義的回撥函式作為引數.回撥函式不止可以是簡單函式,還可以是物件的方法,包括靜態類方法.
我所理解的是如果函式A呼叫函式B,此時函式B就扮演了回撥函式的角色;反之,函式A扮演回撥函式的角色.
回撥函式可以由普通函式來扮演,也可以由上文提到的匿名函式來扮演.

普通函式扮演回撥函式

在下面的程式碼中,將自定義的普通函式 add() 以字串的形式作為普通函式 arithmetic() 的引數傳入,那麼此時自定義的 add() 函式就扮演了回撥函式的角色.

<?php
function arithmetic($functionName, $m, $n) {
    return $functionName($m, $n);
}

function add($m,$n){
    return $m+$n;
};
$result = arithmetic("add",4,6);
echo $result;//輸出 10

匿名函式扮演回撥函式的一種方式

在下面的程式碼中,將自定義的匿名函式直接以引用傳遞的方式作為普通函式 arithmetic() 的引數傳入,那麼此時,自定義的這個匿名函式就扮演了匿名函式的角色.

<?php
function arithmetic($arithmetic, $m, $n) {
    return $arithmetic($m, $n);
}

$result = arithmetic(function ($m, $n) {
    return $m + $n;
}, 4, 6);

echo $result;//輸出 10

匿名函式扮演回撥函式的另一種方式

在下面的程式碼中,將自定義的匿名函式賦值給 $arithmetic ,然後將 $arithmetic 以引用傳遞的方式作為普通函式 arithmetic() 的引數傳入,那麼此時,自定義的這個匿名函式就扮演了匿名函式的角色.

<?php
function arithmetic($arithmetic, $m, $n) {
    return $arithmetic($m, $n);
}

$arithmetic = function ($m,$n){
    return $m+$n;
};

$result = arithmetic($arithmetic,4,6);
echo $result;//輸出 10
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章