1. 程式人生 > >PHP函數語言程式設計初探

PHP函數語言程式設計初探

摘要

不僅最古老的函式式語言Lisp重獲青春,而且新的函式式語言層出不窮,比如Erlang、clojure、Scala、F#等等。目前最當紅的Python、Ruby、Javascript,對函數語言程式設計的支援都很強,就連老牌的面向物件的Java、面向過程的PHP,都忙不迭地加入對匿名函式的支援。越來越多的跡象表明,函數語言程式設計已經不再是學術界的最愛,開始大踏步地在業界投入實用。
也許繼”面向物件程式設計”之後,”函數語言程式設計”會成為下一個程式設計的主流正規化(paradigm)。未來的程式設計師恐怕或多或少都必須懂一點。

定義

簡單說,”函數語言程式設計”是一種”程式設計正規化”(programming paradigm),也就是如何編寫程式的方法論。
它屬於”結構化程式設計”的一種,主要思想是把運算過程儘量寫成一系列巢狀的函式呼叫。

EXample #1

//實現如下功能
    (1 + 2) * 3 - 4
//正常的業務邏輯
 var a = 1 + 2;
 var b = a * 3;
 var c = b - 4;
//函數語言程式設計實現方式
function  demo(){
    $dec=function(){
        $add=function(){
            return 1+2;
        };
        return $add()*3;
    };
    return $dec()-4;
}
call_user_func("demo");

函數語言程式設計的特點

函式是”第一等公民”
所謂”第一等公民”(first class),指的是函式與其他資料型別一樣,處於平等地位,可以賦值給其他變數,也可以作為引數,傳入另一個函式,或者作為別的函式的返回值。
舉例來說,下面程式碼中的add變數就是一個函式,可以作為另一個函式的引數。

Exmple #2

$newArray=array(
    1,2,3,4,5,6,7
);
$add=function($i){
    echo $i+2;
};
array_walk($newArray,$add);

只用”表示式”,不用”語句”
“表示式”(expression)是一個單純的運算過程,總是有返回值;”語句”(statement)是執行某種操作,沒有返回值。函數語言程式設計要求,只使用表示式,不使用語句。也就是說,每一步都是單純的運算,而且都有返回值。
原因是函數語言程式設計的開發動機,一開始就是為了處理運算(computation),不考慮系統的讀寫(I/O)。”語句”屬於對系統的讀寫操作,所以就被排斥在外。
當然,實際應用中,不做I/O是不可能的。因此,程式設計過程中,函數語言程式設計只要求把I/O限制到最小,不要有不必要的讀寫行為,保持計算過程的單純性。

函數語言程式設計不依賴、也不會改變外界的狀態,只要給定輸入引數,返回的結果必定相同。因此,每一個函式都可以被看做獨立單元,很有利於進行單元測試(unit testing)和除錯(debugging),以及模組化組合。

總結

函數語言程式設計是一種程式設計思想,隨著php程式碼的規範化和php匿名函式的推出,函數語言程式設計越來越受到青睞。