【问题标题】:PHP Best Practices: Should a given parameter always have a consistent type?PHP 最佳实践:给定的参数是否应该始终具有一致的类型?
【发布时间】:2013-02-21 23:33:32
【问题描述】:

我有一个函数接受 checkGlossary bool 参数以及可选的 glossary 数组。
它们的状态直接联系在一起。
如果 bool 为 FALSE,则从不需要词汇表,反之,如果 bool 为 TRUE,则总是需要。

对我来说,这似乎可以很容易地简化为:

// Current
function doSomething($param1, $param2, $checkGlossary=FALSE, $glossary=NULL){
    // blah blah blah
    if($checkGlossary)
        array_search($glossary[$param2]);
    // etc etc etc
}

...到:

// Proposed
function doSomething($param1, $param2, $glossary=FALSE){
    // blah blah blah
    if($glossary)
        array_search($glossary[$param2]);
    // etc etc etc
}


我唯一的犹豫是$glossary 的类型(boolarray)是不可预测的。
只要我不违反某些最佳实践准则,我就不会感到困扰。

想法?

【问题讨论】:

  • 最简单的解决方案是删除checkGlossary 标志并仅使用glossary 变量。设置array()为默认值,如果数组为空则省略检查。
  • 最佳实践:当一个方法需要超过 2 个参数时,需要重新考虑(通常)。
  • @TillHelgeHelwig Yours 是我对所提问题最喜欢的答案(因为将 array() 指定为默认值)。如果你把它放在答案中,我会选择它。
  • @WesleyMurch 嗯...看起来我有一些重构要研究 :) 感谢您的建议。
  • @mOrloff 好的。发布它。昨天没时间。 :)

标签: php types parameters


【解决方案1】:

使用 PHP 称为 mixed 数据类型的函数参数总是一个坏主意。它需要在函数中添加额外的代码来检查参数的类型,显然它会变得非常混乱。

在您的特殊情况下,最简单的解决方案可能是使用数组长度作为是否使用词汇表代码的指标。您需要一种方法来声明不应使用词汇表数组。所以你应该问自己:什么时候使用词汇表是没有意义的?当然是空的时候。因此,我建议您去掉该标志并将 array() 定义为其他参数的默认值:

function doSomething($param1, $param2, $glossary=array()) {
    if (count($array) > 0) {
        // do your glossary code here
    }
    // all the other stuff goes here
}

在我看来,这在语义上是正确的,而且效果很好。

我不知道您在那里构建的究竟是什么,但另一种解决方案是将它们全部放入一个类中并将词汇表作为实例变量。如果您可以在多个函数调用中使用词汇表。大概是这样的:

 public class SomeAccurateClassName {
     private $glossary = array();

     function setGlossary(array $glossary) {
         $this->glossary = $glossary;
     }

     function doSomething($param1, $param2) {
         if (count($array) > 0) {
             // do your glossary code here
         }
         // all the other stuff goes here
     }
 }

考虑到您基本上有一个状态(使用词汇表或不使用词汇表),将其封装在一个类中可能是个好主意。

【讨论】:

  • 太棒了!感谢您提供全面的答案/建议。
【解决方案2】:

您可以使用is_array()is_bool() 来检查它的类型!

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多