【问题标题】:What are the problems/benefits of overloading an argument's type?重载参数类型有什么问题/好处?
【发布时间】: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 函数接受混合值,但也有许多不接受。例如,strlencount 在我看来是类似的函数,只是一个处理字符串,另一个处理数组和对象。那么实现处理字符串、数组和对象的countAll 会更好吗?它们只是因为历史原因而分开吗?

【问题讨论】:

  • 我怀疑“最佳实践”是否包括使用诸如此类的动态插入函数...您将拥有用于公开特定添加/更新函数的数据对象的类。
  • 我同意一个类会更好,但觉得这个例子没有必要。这是因为我的实现是简单地将上述函数放入数据库抽象类中,然后用$db->insert($table, $columns, $values) 调用它。据我所知,这保留了上述问题的相关部分,因为 $values 仍然可以是字符串或数组。您是说基于不同类的实现可以解决此类问题吗?

标签: php types arguments


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    有很多原生 PHP 函数可以接受 mixed 参数。

    json_encodepreg_replacearray_fill_keys 仅举几个例子。

    这样做很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-27
      • 2017-06-08
      • 2014-09-08
      • 2018-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多