$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)
Демек, принципът явно е следният:
Карай от ляво надясно, гледай оператора, който оперира с операндите по двойки (демек, всяка със следващата дясна) и според оператора – тайпкаствай!
Литература: