PHP тайпкаствания

$x1 = 16 + 4 + 'V4olvo';

Преди PHP 8, $x1 ще е int(20), защото в PHP, за разлика от JS, плюсът е само аритметичен оператор. Започва от ляво на дясно, събира първите две, после вижда, че трябва да добави и стринг. Ако този стринг поне ЗАПОЧВА с число – ще вземе само това число, иначе ще смята този стринг за 0, дори и вътре в стринга да има числа. Затова например това:

$x2 = 16 + 4 + '4Volvo'; // $x2 ще е int(24), демек все едно 16
$x3 = 'Volvo' + 16 + 4;  // $x3 ще е int(20), демек все едно 0 + 16 + 4

//var_dump(16 . 4);die;  // string(3) "164" явно операторът (конкатениране) предварително ги каства към стрингове

//var_dump('16' + '4');die; // int(20) явно операторът (събиране) предварително ги каства към числа

Но след PHP 8 ще гръмне с:
Uncaught TypeError: Unsupported operand types: int + string…
Но вече ако пробваме: $x4 = 16 + 4 + ‘4Volvo’;
ще върне 24 но с Warning: A non-numeric value encountered in…

Също, преди 8:

var_dump(0 == 'asdasd');     // true
var_dump(0 === 'asdasd');    // false

но след 8:

var_dump(0 == 'asdasd');    // false
var_dump(0 === 'asdasd');   // false

Демек, от 8 нагоре нещата са още по-затегнати. Tова, което не започва с цифра, не може да се кастне към число.

А иначе, цялата работа е следната: то започва от ляво на дясно, гледа оператора, и се опитва да кастне към число или стринг.

Демек, вижда ЕДНОНЕЩО + ДРУГОНЕЩО и разсъждава така: „Имам плюс, демек аритметичен оператор, значи трябва да събирам числа. Но това не са числа. Ми дай да опитам да ги направя числа.“ И до колкото успее – успее.

Аналогично – и при точката (конкатенацията), подавай му каквито щеш операнди, то като види, че трябва да конкатенира – първо ще опита да ги кастне към стрингове.

Затова се казва, че в PHP операторът „коли и беси„,  операторът е цар и господар.

$x4 = 16 + 4 . 'Volvo';

$x4 ще е string „20Volvo“ – явно както в JS, ги започва от ляво надясно, и понеже първо има събиране – каства операндите към числов тип (то в сличая няма нужда де, но все пак), после вижда „я! конкатениране, айде всичко до тука – стринг, и тогава конкатенира“. И така и останалите, ако има такива.

$x5 = 'Volvo' . 16 + 4;

$x5 ще е int 4 – явно първо конкатенира Volvo с 16, което прави ‘Volvo16’, и после се опитва да събира с 4, но понеже Volvo16 не започва с цифра, става на 0 и тогава събира с 4

$cc = 100 + '100'; var_dump($cc); // int(200)
$mc = '100' + 100; var_dump($mc); // int(200)
$fc = 100 + 100;   var_dump($fc); // int(200)

Демек, принципът явно е следният:
Карай от ляво надясно, гледай оператора, който оперира с операндите по двойки (демек, всяка със следващата дясна) и според оператора – тайпкаствай!

Литература:

final е само за класове и методи

final е само за класове и методи, но не и за пропъртита. Ако зададеш final на пропърти, ще гръмне с: “Fatal error: Cannot declare property … final, the final modifier is allowed only for methods and classes”

С final забраняваш оверрайдването само на методи, екстендването на класове, но не важи за пропъртита.

Изобщо, клас-константите са …

Изобщо, клас-константите са СТАТИЧНИ по принцип. Може да ги достъпваш през клас, напр.:
Patapan::CONST_NAME

може през обект, но статично
$p::CLASS_NAME

но не и динамично (демек per object basis)
$p->CLASS_NAME

Същото важи и за интерфейсните константи.