在寫PHP程式的時候,我常常希望能有「同名異式」的東西出現,不過我知道那是辦不到的。
C++的同名異式是編譯器靠著函數的簽名型態自己處理,實際上是在編譯的時候把函數名稱編碼掉了,只是寫程式的人不自知而已。
由於PHP的變數是弱型態,所以用C++的方式也沒法達到同樣的效果。

而我比較愚蠢,同時我也信任自己的編程手法,所以我自己對函數作命名,而不依賴__call這種魔術方法作前處理,而對於單純的函數,即便想用魔術方法也沒輒。

對於命名空間來說,除非你把相關的函數封在一個class裡面,不過這樣程式碼並不會比較清晰。
另外,我個人對於參照的使用到了有些病態的地步,所以我會經常review我自己寫的Code,看看哪裡「可以」使用參照,不過我目前嘗試反過來作,看看哪裡「可以不」使用參照。

底下是我示範的幾個函數設計:

function &變數:預設(&$參照, &$預設 = '', $複製 = true){
    if(false == isset($參照)){
        $參照 = &變數:賦值($參照, $預設, $複製);
    }
    return $參照;
}

function &變數:賦值(&$參照, &$值 = '', $複製 = true){
    if ($複製 && is_object($值)){
        $參照 = clone $值;
    } else {
        $參照 = $值;
    }
    return $參照;
}
function &陣列:參照(&$陣列, &$索引表 = array()){
    $參照 = &$陣列;
    foreach ($索引表 as &$索引) {
        if (false == is_array($參照) && false == is_null($參照)) {
            $輸出 = false;
            return $輸出;
        } else if (empty($索引)) {
            $參照 = &$參照[];
        } else {
            $參照 = &$參照[$索引];
        }
    }
    return $參照;
}

function &陣列:賦值(&$陣列, &$索引表 = array(), &$值 = '', $複製 = true) {
    $參照 = &陣列:參照($陣列, $索引表);
    變數:賦值($參照, $值, $複製);
    return $陣列;
}

function 陣列:過濾(&$陣列, &$預設 = array()){
    return array_intersect_key($陣列 + $預設, $預設);
}

function &陣列:轉換(&$陣列, &$表格 = array()){
    $輸出 = array();
    foreach ($表格 as $鍵 => &$值) {
        if (isset($陣列[$鍵])) {
            $輸出[$值] = &$陣列[$鍵];
        }
    }
    return $輸出;
}

function &陣列:連接(&$陣列, &$表格 = array(), $符號 = '='){
    $輸出 = array();
    foreach ($表格 as $鍵 => &$值) {
        if (isset($陣列[$鍵])) {
            $輸出[$值] = $值 . $符號 . $陣列[$鍵];
        }
    }
    return $輸出;
}
arrow
arrow
    全站熱搜

    HACGIS 發表在 痞客邦 留言(0) 人氣()