Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP最佳实践:给定的参数是否应该始终具有一致的类型?_Php_Types_Parameters - Fatal编程技术网

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

PHP最佳实践:给定的参数是否应该始终具有一致的类型?,php,types,parameters,Php,Types,Parameters,我有一个函数,它接受一个checkGlossarybool参数以及一个可选的glossary数组。 它们的状态直接联系在一起。 如果bool为FALSE,则从不需要术语表,反之,如果bool为TRUE,则始终需要术语表 在我看来,这似乎可以很容易地简化为: // Current function doSomething($param1, $param2, $checkGlossary=FALSE, $glossary=NULL){ // blah blah blah if($ch

我有一个函数,它接受一个
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
(bool或array)的类型是不可预测的。
只要我不违反一些最佳实践准则,我就不会感到烦恼


想法?

您可以使用和检查其类型

将函数参数与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
     }
 }

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

最简单的解决方案是删除
checkGlossary
标志,只使用
glossary
变量。将
array()
设置为默认值,并检查数组是否为空。最佳做法:当一个方法使用两个以上的参数时,需要重新考虑(通常)@TillHelgeHelwig Yours是我对所问问题最喜欢的答案(因为指定
array()
为默认值)。如果你把它写在答案里,我会选择它。@WesleyMurch-hmm。。。看起来我有一些重构需要研究:)谢谢你的建议。@mOrloff好的。贴出来了。昨天没有时间。:)好极了谢谢你的全面回答/建议。