0

例如,在 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++ 中,我将重新设计代码或创建数据结构以保持其类型。但我应该这样做吗?

4

1 回答 1

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);

...但是当然你失去了松散类型语言的一些好处。在一天结束时,这取决于你!

于 2017-12-29T18:13:21.417 回答