我经常写函数,其操作取决于某些参数的类型。一个例子是一个可以帮助我将行插入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函数接受混合值,但也有许多不接受混合值。例如,strlen
和count
在我看来是类似的函数,除了一个处理字符串而另一个处理数组和对象。那么实现处理字符串,数组和对象的countAll
会更好吗?它们是否仅因历史原因而分开?
答案 0 :(得分:1)
答案 1 :(得分:1)
PHP不仅具有允许这样做的核心功能,而且像CakePHP这样的流行PHP框架通常提供接受这种混合参数的方法。
唯一需要注意的是,当一个空值传递给函数时,你的函数会以一种特殊的方式运行(可能会返回所有记录或其他内容)。确保相关功能之间的行为类型一致并记录在案。否则,调用者无意中传递一个空数组(可能是另一个函数的结果)可能会让人感到惊讶。