Например, в 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 ++, где я бы перепроектировал код или создал структуры данных там, где он будет поддерживать свой тип. Но я должен сделать это?
Тот факт, что 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);
…но затем, конечно, вы теряете некоторые преимущества свободно набираемого языка. В конце дня, это зависит от вас!
Других решений пока нет …