PHP最佳实践:给定参数应始终具有一致的类型吗?

我有一个接受checkGlossary bool参数以及可选词汇表数组的函数.
它们的状态直接联系在一起.
如果布尔值为FALSE,则永远不需要词汇表;反之,如果布尔值为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的类型(布尔型或数组型)是不可预测的.
只要我不违反某些最佳实践准则,它就不会打扰我.

有什么想法吗?

解决方法:

具有PHP称为混合数据类型的函数参数始终是一个坏主意.它需要函数中的其他代码来检查参数的类型,显然它会变得非常混乱.

在您的特殊情况下,最简单的解决方案可能是使用数组长度作为是否使用词汇表代码的指标.您需要一种声明不使用词汇表数组的方法.因此,您应该问自己:何时使用词汇表毫无意义?当它为空时,当然.因此,我建议您摆脱该标志,并将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
     }
 }

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

上一篇:HTML5-Android平板电脑-输入类型编号


下一篇:语法是什么意思? Func sampleFunction