Следует ли использовать строго типизированные концепции кодирования при работе с языком свободного типа?

Например, в 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++, где я мог бы перепроектировать код или создать структуры данных там, где он будет поддерживать свой тип. Но я должен сделать это?

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

... но тогда, конечно, вы теряете некоторые преимущества свободно набираемого языка. В конце концов, решать вам!

Другие вопросы по тегам