【发布时间】:2010-07-20 15:26:52
【问题描述】:
我经常编写函数,其操作取决于某些参数的类型。一个例子是一个函数,它可以帮助我将行插入到 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。这个案例和前面案例的区别在于,从技术上讲,$values 的类型在 insertArray 和 insertMulti 之间没有改变。但是,我们处理 $values 的方式确实发生了变化,这种变化取决于 $values 的结构。因此,如果类型重载有好处和陷阱,它们是否也适用于这种情况,还是应该区别对待?
编辑:感谢您的回答!我意识到有许多 PHP 函数接受混合值,但也有许多不接受。例如,strlen 和count 在我看来是类似的函数,只是一个处理字符串,另一个处理数组和对象。那么实现处理字符串、数组和对象的countAll 会更好吗?它们只是因为历史原因而分开吗?
【问题讨论】:
-
我怀疑“最佳实践”是否包括使用诸如此类的动态插入函数...您将拥有用于公开特定添加/更新函数的数据对象的类。
-
我同意一个类会更好,但觉得这个例子没有必要。这是因为我的实现是简单地将上述函数放入数据库抽象类中,然后用
$db->insert($table, $columns, $values)调用它。据我所知,这保留了上述问题的相关部分,因为 $values 仍然可以是字符串或数组。您是说基于不同类的实现可以解决此类问题吗?