重载参数类型有哪些问题/好处?

时间:2010-07-20 15:26:52

标签: php types arguments

我经常写函数,其操作取决于某些参数的类型。一个例子是一个可以帮助我将行插入mysql数据库的函数。

function insert($table, $columns, $values) {
    if(is_string($values)) {
        $values = "('" . $values . "')";
        }
    else if(is_array($values)) {
        $values = "('" . implode("','", $values) . "')";
        }

    //process $table and $columns here

    mysql_query("INSERT INTO $table $columns $values");
    }

我的想法是,有时我只想插入一个值,但有时我会想要插入一个值数组。但是,这意味着$ values的类型将取决于具体情况,我注意到一般情况下,内置的PHP函数往往会避免这种情况。我觉得如果PHP核心实现了这样一个函数,它将被分成insertString和insertArray来处理这两种情况。重载类型的好处是,只要是字符串或数组,用户就不需要担心它们放入$ values的内容。例如,如果他们忘记了他们可以传入一个字符串,他们仍然可以传递array('singleValue')而没有任何问题。因此,使用该功能变得更容易。这种方法有什么缺陷吗?

此外,我们可以扩展我们的功能,一次插入多行。这些将作为多维数组输入,因此需要一条处理它们的行,如下所示:

if(is_multi($values)) {
    foreach($values as $key => $value) {
        $values[$key] = "('" . implode("','", $value) . "')";
        }
    $values = implode(",", $values);
    }

我们可以再次将其添加到原始函数或创建一个新函数insertMulti。这种情况与前一种情况的区别在于,从技术上讲,$ value的类型在insertArray和insertMulti之间不会改变。但是,我们处理$值的方式确实发生了变化,这种变化取决于$ values的结构。因此,如果键入重载有好处和陷阱,它们是否也适用于这种情况,还是应该区别对待?

编辑:谢谢您的回答!我意识到有许多PHP函数接受混合值,但也有许多不接受混合值。例如,strlencount在我看来是类似的函数,除了一个处理字符串而另一个处理数组和对象。那么实现处理字符串,数组和对象的countAll会更好吗?它们是否仅因历史原因而分开?

2 个答案:

答案 0 :(得分:1)

有很多本机PHP函数接受mixed个参数。

json_encodepreg_replacearray_fill_keys仅举几例。

这样做完全没问题。

答案 1 :(得分:1)

PHP不仅具有允许这样做的核心功能,而且像CakePHP这样的流行PHP框架通常提供接受这种混合参数的方法。

唯一需要注意的是,当一个空值传递给函数时,你的函数会以一种特殊的方式运行(可能会返回所有记录或其他内容)。确保相关功能之间的行为类型一致并记录在案。否则,调用者无意中传递一个空数组(可能是另一个函数的结果)可能会让人感到惊讶。