【问题标题】:What are the advantages of function calls without mixed variables?没有混合变量的函数调用有什么好处?
【发布时间】:2016-05-30 09:58:17
【问题描述】:

我知道 PHP 是一种非常容错的语言,我想这就是为什么你可以使用 mixed variables 来进行函数调用,例如:

/**
 * @param mixed $bar
 **/
function foo($bar) {
    // Do something with $bar, but check it's type!
}

有没有推荐的方式使用这种混合变量?

对于我自己的项目,我尽量避免这种混合变量,只是为了以后出现错误的问题更少,代码清晰。

在 PHP 7 中,应该可以声明这个函数期望的变量类型,不是吗?这是怎么做到的?

【问题讨论】:

  • 我们可以给函数 foo (array $bar) { //$bar 应该是数组} 添加类型
  • @vijaykumar 但这仅适用于 PHP 7,对吗?
  • 类型检查很不错,原因有很多,尽可能使用解释器(而不是手动)进行检查总是最好的。但是总会有这样的情况,混合变量的代码比强类型的代码更干净。
  • 不,它适用于 5.3 +

标签: php php-7 code-structure code-standards


【解决方案1】:

这可能会因为“基于意见”而被关闭,但这仍然是一个好问题。

一个函数应该做一件事。如果您需要这样做:

if it's a string
    do this
else if it's a Foo object
    do this other thing

那么它做的不止一件事,就是“不太理想”的形式。

您为什么不直接提供两个命名良好的方法,例如:getThingById(int)getThingByFilters(Filters)getThingLike(string) 等?它也会使您的代码更具可读性和可预测性。

【讨论】:

  • 我认为,如果代码质量很好,您不能将其视为基于意见的问题。当然好的和坏的代码可以输出相同的正确结果,但是一个有更多的优势......
  • 谁说函数应该做一件事?我想这才是真正的答案。
  • Bob Martin 可能对清洁代码有话要说(阅读他关于这个主题的书:它是金子),但我认为这只是“获得的智慧”吗?我听说很多人支持它(当我审查代码时我总是会支持它),而且我从未听说或读过有人提出反对它的有说服力的案例。当然,一切都应该用“取决于”来衡量,但是对于这里的这个问题,我认为这是正确的建议。你不是吗?
  • 哦,当我建议它可能会因为任何基于意见的答案而关闭时......我并不是要建议这是一件的事情。这只是这个联合的不太经过深思熟虑的规则之一,社区版主喜欢锻炼他们的“密切”手指,因为他们没有更好的补充,但仍然希望在这里得到验证。这有点有毒,但我猜 IT 行业的一些人就是这样 :-(
  • 好吧,也许我应该问一下没有混合变量的函数调用的优点?
【解决方案2】:

这很快就会成为一个见仁见智的问题,但是,我觉得松散的类型会引入更多发生错误的可能性。在某些情况下它可能是合适的,但通常,对于需要可靠和可维护的代码(可能高于“灵活”),严格类型更安全。

PHP 5 有“类型提示”:

从 PHP 5.0 开始,您可以使用类或接口名称作为类型提示,或 self:

<?php
function testFunction(User $user) {
    // `$user` must be a User() object.
}

从 PHP 5.1 开始,您还可以使用 array 作为类型提示:

<?php
function getSortedArray(array $array) {
    // $user must be an array
}

PHP 5.4 为函数/闭包添加了callable

<?php
function openWithCallback(callable $callback) {
    // $callback must be an callable/function
}

从 PHP 7.0 开始,标量类型也可以使用(intstringboolfloat):

<?php
function addToLedger(string $item, int $quantity, bool $confirmed, float $price) {
    ...
}

从 PHP 7 开始,现在称为 Type Declaration

PHP 7 还引入了Return Type Declarations,允许您指定函数返回的类型。这个函数必须返回一个float

<?php
function sum($a, $b): float {
    return $a + $b;
}

如果您不使用 PHP7,则可以使用可用的类型提示,并使用正确的 PHPDoc documentation 填补剩余的空白:

<?php

/**
 * Generates a random string of the specified length, composed of upper-
 * and lower-case letters and numbers.
 *
 * @param int $length Number of characters to return.
 * @return string Random string of $length characters.
 */
public function generateRandomString($length)
{
    // ...

    return $randomString;
}

许多编辑器可以解析这些 cmets 并警告您输入不当(例如 PHPStorm)。

【讨论】:

  • 严格的输入也会给你的代码带来错误,只是不同的错误。向 ESA 询问他们的 Arianne 5 火箭、Flight 501 以及从 64 位浮点到 16 位有符号整数的转换;-)
  • 我同意它可以。但在 PHP 中就不那么好了。类型很简单;没有尺寸。
猜你喜欢
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 2013-09-16
  • 2019-10-12
  • 1970-01-01
  • 2012-05-22
相关资源
最近更新 更多