Subtype polymorphism

Още известен като Inclusion Polymorphism – ако имаме клас А, който бива наследен от клас B, то обекти от клас B могат да бъдат използвани вместо такива от клас А, стига разбира се да не са private.

Важи също и за примитивните типове като например int и float. Долният пример на PHP e валиден, защото int се явява като подтип на float:

function patapan(float $a) { }

patapan(123);

Да си спомним за т.н. Numeric tower – йерархично подредени числени типове. В PHP откъм числени типове имаме само Integer и Float. Float e програмният (или компютърният) начин за съхранение на рационални числа (Rational), разликата е, че по дефиниция, от математическа гледна точка рационалните числа могат да бъдат безкрайни дроби (напр. 1/3 е 0.333333…), а float’s трябва да могат все пак да съхранят тази безкрайна дроб с известно закръгляне и загуба на точност.

Type safety

Един език се приема за 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 …