【问题标题】:Method Overloading in PHPPHP中的方法重载
【发布时间】:2012-02-17 16:32:21
【问题描述】:

请原谅我的新手。在基于 ASP.Net 的网站上工作时,我记得看到一些方法可以接受不同数量的参数。具体来说,它们会做不同的事情,具体取决于传递给它们的参数数量。

例如:

Email.sendEmail(address,subject,body);

会做一些不同的事情:

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

PHP 中的方法可以做类似的事情吗?这东西叫什么?还是我完全记错了什么?

【问题讨论】:

  • 这称为method/function overloading。如果没有涉及 func_get_args 或混淆变量名的变通办法,PHP 本身就没有此功能。嘘:-(
  • @cbuckley PHP 似乎有更好的重载方式。 . . stackoverflow.com/a/9332030/798818
  • 重载 != 可选参数。这允许不同的数量,但必须在函数中处理数据类型的检查,而不是显式定义多个函数签名。
  • @cbuckley 就是这样!我以为它被称为“重载”,但由于某种原因,我找不到一个很好的例子。
  • 我同意 Tim 的观点,因为它还允许在不破坏 E_STRICT 合规性的情况下进行扩展。

标签: php methods overloading


【解决方案1】:
function sendEmail($address, $bccaddresses, $subject, $body=NULL) {
  if ($body === NULL) {
     $bccaddresses=""; //or whatever default you want
     //shift arguments:
     $subject = $bccaddresses; $body = $subject;
  }
}

【讨论】:

  • +1 这就是我所说的混淆变量名 :-) 效果很好,但如果没有良好的文档,可能会很糟糕!
  • +1 这看起来确实可行,但我会接受你的建议,cbuckley。
【解决方案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"=>"test@test.com", "subject"=>"Hi!"));

这使您可以将参数作为命名值传递,并带有您认为合适的可选值。

【讨论】:

    【解决方案3】:

    您正在搜索 func_num_args()func_get_args()

    另请参阅相关示例,它向您展示了如何完全按照您的需要进行操作。

    【讨论】:

      【解决方案4】:

      在 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多