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

$x1 = 16 + 4 + 'V4olvo';

$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-то), започва от ляво на дясно, гледа оператора, и се опитва да кастне към число или стринг.

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

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

Затова се казва, че в 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)

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *