2012-02-17 34 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