对不起我的新手。在基于ASP.Net的网站上工作时,我记得看到一些方法可以接受不同数量的参数。具体来说,它们会做不同的事情,具体取决于传递给它们的参数的数量。PHP中的方法重载
例如:
Email.sendEmail(address,subject,body);
会做一些不同:
Email.sendEmail(address,bccaddresses,subject,body);
是否有可能在PHP方法做同样的事情?这个东西叫什么?或者我只是完全误解了一些东西?
对不起我的新手。在基于ASP.Net的网站上工作时,我记得看到一些方法可以接受不同数量的参数。具体来说,它们会做不同的事情,具体取决于传递给它们的参数的数量。PHP中的方法重载
例如:
Email.sendEmail(address,subject,body);
会做一些不同:
Email.sendEmail(address,bccaddresses,subject,body);
是否有可能在PHP方法做同样的事情?这个东西叫什么?或者我只是完全误解了一些东西?
你可以使用关联数组作为参数,并利用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!"));
这使您可以将参数作为命名值传入,并带有可选的值,只要您认为合适。
您正在搜索func_num_args()
和func_get_args()
。
另请参阅相关示例,它会告诉您如何完成您所需的操作。
在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
function sendEmail($address, $bccaddresses, $subject, $body=NULL) {
if ($body === NULL) {
$bccaddresses=""; //or whatever default you want
//shift arguments:
$subject = $bccaddresses; $body = $subject;
}
}
+1这就是我所说的混淆变量名称:-)工作得很好,但没有良好的文档就可能是地狱般的! – cmbuckley 2012-02-17 17:31:37
+1这看起来好像可以工作,但我会和你的建议一起去,cbuckley。 – 2012-02-17 23:12:57
这被称为[方法/函数重载](http://en.wikipedia.org/wiki/Function_overloading)。 PHP本身没有这个,没有hacky的变通方法,涉及到func_get_args或混淆变量名称。 Boo :-( – cmbuckley 2012-02-17 16:36:20
@cbuckley PHP似乎有一种更好的重载方式... http://stackoverflow.com/a/9332030/798818 – Mob 2012-02-17 16:37:47
重载!=可选参数。这允许不同的参数,但允许检查数据类型必须在函数中处理,而不是明确定义多个函数签名 – cmbuckley 2012-02-17 16:38:34