Един език се приема за type safe ако самият език (компилатор, интерпретатор) следи за спазване на правилните типове на стойностите, присвоявани нa променливите и на връщаните резултати, според това как са зададени програмно, демек още на ниво компилация.
Както и след това, по време на изпълнение, дали не се опитваме да изпълним операция с променливи с несъвместими стойности, като например да съберем integer със string и т.н…
Виж, integer с boolean може винаги, просто явно идеята е, че PHP винаги ще направи каквото може за да тайпкастне, само и само да извърши операцията.
Стига да е възможно, демек string ‘hello’ не може да се тайпкастне към integer 20, но ’20hello’ може да се тайпкастне към integer 20.
Type safety-то поне на PHP, има четири аспекта:
1) Дали можеш динамично да променяш типа на дадена променлива, задавайки и стойности от разлилчен тип динамично (runtime).
2) Дали можеш да извършваш операции с променливи от различен тип, като имаме предвид, че PHP ще направи каквото може да тайпкастне стойностите според оператора, само и само да изпълни операцията.
3) Дали можем да достъпим недекларирана променлива:
echo $c;
ще доведе до: Warning: Undefined variable $c in…
4) Дали можем да достъпим несъществуващ елемент на масив:
$d = array('hello', 'world');
echo $d[21];
ще получим: Warning: Undefined array key 21 in…
Важно да се прави разликата между static/dynamic и strong/weak. Първото е по отношение на задаването на стойности, второто – по операциите, които извършваме с тях.
PHP може да се счита за dynamically typed, както и strong typed език, защото можеш за даден променлива, да и задаваш динамично (runtime) стойности от различен тип, демек, да и сменяш типа.
Но не и примерно да събираш различни типове (не забравяме все пак, че PHP ще направи каквото може да тайпкастне стойностите според оператора, само и само да изпълни операцията).
Пример за dynamic typing, който е ОК в PHP и с който сменяме типа на променливата:
$a = true;
$a = 10;
Toва е идеята на dynamically typed за разлика от static typed – динамично да можеш да сменяш типа на дадената променлива, освен ако изрично не си и го задал.
При static typing зададен ли е изрично типът – край.
А strong typing, за разлика от weak typing значи вече когато извършваме операции с дадените променливи, дали не се опитваме да изпълним операция с променливи с несъвместими стойности, като например да съберем boolean с integer…
Ако опитаме да умножим boolean с integer,
$a = 123;
$b = true;
echo $a + $b;
ще доведе до:
Fatal error: Uncaught TypeError: Unsupported operand types: boolean + int …