2017-08-28 218 views
0

即時學習php 即時通訊我試圖添加一個帶有註釋的日誌到我的函數輸出。 現在它看起來是這樣的:如何以其他函數作爲參數調用函數

//the function 
function add1($x){ 
    if($GLOBALS['logging'] === 'on'){ $log[] = 'Adding 1 to '.$x;}; 
    $a = $x + 1; 
    if($GLOBALS['logging'] === 'on'){ 
    $return[] = $a; 
    $return[] = $log; 
    return $return; 
    }else{ return $a; }; 
}; 
//calling the function 
    if($GLOBALS['logging'] === 'on'){ 
    $return = add1($x); 
    $number = $return[0]; 
    $log = $return[1]; 
    }else{ $number = add1($x); }; 

林有點的事實,我需要的if語句重新鍵入此惱火。 所以我做了一個單獨的函數返回函數 看起來像這樣:

//function 
    function log_return($data = 'x', $log = 'x'){ 
    if($GLOBALS['logging'] === 'on'){ 
     if($data !== 'x') $return[] = $data; 
     if($log !== 'x') $return[] = $log; 
     return $return; 
    } return $data; 

};//function end 

而且隨着其返回:

return $return = isset($log) ? log_return($data, $log) : log_return($data); 

現在我quastion是:有沒有一種方法來調用一個函數功能.. 像:

call_function(add1($x)); 

,所以我可以用任何日誌或不回吧..

+0

可能的重複:https://stackoverflow.com/questions/2700433/accept-function-as-parameter-in-php – ChickenFeet

+1

不要使用$ GLOBALS。將你需要的參數傳遞給你的函數。這是更安全的自我記錄,並且可以捕獲錯誤,特別是如果您使用現在可在PHP中使用的類型提示。 – gview

+1

這就是許多框架圍繞依賴注入模式構建的原因。我強烈建議:http://fabien.potencier.org/what-is-dependency-injection.html – gview

回答

1

給出了答案https://stackoverflow.com/a/2700760/5387193 - 這應該工作:

function add1($a) 
{ 
    // add1 code goes here 
} 

function call_function($name, $param) 
{ 
    $name($param); 
} 
call_function('add1', $x); 

在一個側面說明,你的變量和函數名是不是很直觀。也許你應該學習如何編寫高質量的可讀代碼。我推薦閱讀Martin Fowler的「重構」第9章,它非常好。您可以在網上找到PDF版本。

另請注意,您的返回語句return $return = isset($log) ? log_return($data, $log) : log_return($data);對$ return有不必要的分配。代碼應該簡單閱讀

return isset($log) ? log_return($data, $log) : log_return($data); 
1

是的,這是可能的。爲了簡化:

function first($x) { 
    return $x+1; 
} 
function second($y) { 
    return $y+1; 
} 
echo second(first(1)); // Returns 3, ie. 1+1+1 
1

正如gview在他的評論中所說的,不要使用全局變量。參數列表的存在有幾個原因,包括但不限於使代碼更易於閱讀,編輯和調試。功能和變量名稱也是如此。

此外,你的代碼非常混亂。它可以合併:

function addTo($currentValue, $valueToAdd, $logging = 0) 
{ 
    if ($logging) { 
     logWrite('addTo', "Adding $valueToAdd to $currentValue"); 
     return $currentValue + $valueToAdd; 
    } else { 
     return $currentValue; 
    } 
} 

function logWrite($operation, $message) 
{ 
    $log = getLog(); // maybe it's a file, or DB record or something 
    // perform the write, depending on your implementation 
} 

$number = addTo($someStaringValue, $someOtherValue, 1); 

所有這一切都表示,日誌記錄不應該控制程序流。換句話說,不管系統是否記錄了什麼,都不應該影響你的代碼試圖做什麼。我真的認爲你需要更廣泛地瞭解你想要做什麼,並將其分解成組件。

充其量,您的代碼應該告訴記錄器記錄信息,並且記錄器本身應該確定是否實際打開記錄日誌。如果是,則會記錄信息。如果沒有,那麼調用記錄器的代碼仍然工作並開始其業務。

+0

感謝您的答覆,我會重寫代碼而不使用全局變量,並且是日誌已打開(文件或屏幕)開/關。有很多工作要做..試圖儘可能地鞏固。 –

相關問題