【问题标题】:Should one use strongly typed coding concepts when working with a loose type language?在使用松散类型语言时应该使用强类型编码概念吗?
【发布时间】:2018-06-10 02:49:06
【问题描述】:

例如,在 PHP 或其他松散类型的语言中,我可以有一些这样的代码:

/* PSEUDOCODE based on PHP */
$selection = $this->getSelection($id);

/* Below code will not work in a strict language */
if (is_array($selection))
    show_template($selection);//forwards *array* results to the view script
else 
    print $selection; //prints the *string* notice message

/* Returns either array or string */
/* return param doubles as a business-payload or error message */
function getSelection($id)
{
    $result = $db->getResultsById($id);
    if ($result) return $result;//array
    else return "No results";//string
}

因为我可以用 PHP 和类似的语言做到这一点,是否意味着我应该这样做?

另一种方法是强迫自己编写类似的代码,例如,在 C++ 中,我将重新设计代码或创建数据结构以保持其类型。但我应该这样做吗?

【问题讨论】:

  • 即使在 C++ 中,您也可以将任何内容转换为 void 指针并返回 - 但这并不意味着您应该这样做!这同样适用于 PHP。因为您可以返回混合类型,这并不意味着您应该这样做。干净的界面使您的代码更易于维护和容错
  • 这是 PHP 开发的总体方向(参数和返回值类型命中、标量的严格类型等)。它通过静态分析让您更好地控制代码。

标签: php strict loose-typing


【解决方案1】:

PHP 不是强类型的事实既是一种恩赐,也是一种诅咒。当您希望能够处理多种类型时,这非常有用,但如果处理不当也可能导致一些错误代码。就个人而言,我尽可能在 PHP 中使用“强类型”以避免错误(它看起来更简洁,通常更容易阅读/理解)。即便如此,PHP 可以并且通常会随时随地自动进行转换(见下文),这就是“诅咒”的用武之地。

function foo(string $string) : int{
    //$string will be cast as string if possible, return value is cast as int if possible
    return $string;
}

echo foo(1);

输出:

1

不幸的是,强制类型的唯一真正方法(不使用 declare(strict_types=1);)是通过类型检查;

function foo($string){
    if(is_string($string) && is_numeric($string)){
        return (int)$string;
    }else{
        return null;
    }
}

var_dump(foo(1));
echo '<br>';
echo foo('1');

输出:

NULL
1

或者,您可以告诉 PHP 使用严格类型;

declare(strict_types=1);

...但是你当然失去了松散类型语言的一些好处。归根结底,一切由你决定!

【讨论】:

  • 你听说过declare(strict_types=1); 吗?
  • 顺便说一句。如果您不定义类型提示或使用混合,您仍然可以编写松散类型的代码
  • @Philipp 是的,但是你会失去自动转换,这有时对正确的应用程序很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2010-09-12
相关资源
最近更新 更多