2012-02-17 60 views
1

對不起我的新手。在基於ASP.Net的網站上工作時,我記得看到一些方法可以接受不同數量的參數。具體來說,它們會做不同的事情,具體取決於傳遞給它們的參數的數量。PHP中的方法重載

例如:

Email.sendEmail(address,subject,body); 

會做一些不同:

Email.sendEmail(address,bccaddresses,subject,body); 

是否有可能在PHP方法做同樣的事情?這個東西叫什麼?或者我只是完全誤解了一些東西?

+1

這被稱爲[方法/函數重載](http://en.wikipedia.org/wiki/Function_overloading)。 PHP本身沒有這個,沒有hacky的變通方法,涉及到func_get_args或混淆變量名稱。 Boo :-( – cmbuckley 2012-02-17 16:36:20

+0

@cbuckley PHP似乎有一種更好的重載方式... http://stackoverflow.com/a/9332030/798818 – Mob 2012-02-17 16:37:47

+0

重載!=可選參數。這允許不同的參數,但允許檢查數據類型必須在函數中處理,而不是明確定義多個函數簽名 – cmbuckley 2012-02-17 16:38:34

回答

2

你可以使用關聯數組作爲參數,並利用extract()

function sendMail($opts){ 
    extract($opts, EXTR_SKIP); // EXTR_SKIP prevents extract from overwriting anything already in the symbol table 
    if(isset($bccaddresses)){ 
     // do something with the bcc addresses 
    } 
    echo "sending some mail to $to with subject $subject"; 
} 

sendMail(array("to"=>"[email protected]", "subject"=>"Hi!")); 

這使您可以將參數作爲命名值傳入,並帶有可選的值,只要您認爲合適。

1

在PHP中,您可以爲函數設置默認值。

function myFunc($val1 = 1, $val2 = 2, $val3 = 3){ 
    echo "$val1 $val2 $val3"; 
} 


myFunc();  // outputs 1 2 3 
myFunc(5); // outputs 5 2 3 
myFunc(8, 1); // outputs 8 1 3 
3
function sendEmail($address, $bccaddresses, $subject, $body=NULL) { 
    if ($body === NULL) { 
    $bccaddresses=""; //or whatever default you want 
    //shift arguments: 
    $subject = $bccaddresses; $body = $subject; 
    } 
} 
+0

+1這就是我所說的混淆變量名稱:-)工作得很好,但沒有良好的文檔就可能是地獄般的! – cmbuckley 2012-02-17 17:31:37

+0

+1這看起來好像可以工作,但我會和你的建議一起去,cbuckley。 – 2012-02-17 23:12:57