В този урок ще комбинираме знанията от досегашните и ще прехвърляме данни от един тип към друг. Ето един пример:
<?php
$a='1';
?>
Тук 1 е string, тоест PHP го възприема като текст, не като число. Можете ли да се досетите какво ще стане, ако опитаме да го съберем с някакво число? Е, да пробваме:
<?php
$a='1';
echo $a+2;
?>
По принцип такова събиране е невалидно, но PHP е интелигентен език и вижда какво се опитваме да направим, и ще се опита да прехвърли автоматично информацията от текст към число. Затова резултатът от въпросния код е 3. В конкретния пример PHP прехвърли текстът 1 (string) към integer. Обърнете внимание, че PHP винаги ще прави това, освен ако му наредим да не го прави.
Прехвърляне от текст (string) към число с плаваща запетая (float):
<?php
$a='1.15';
echo $a+2;
?>
PHP вижда, че стойността на променливата е число с плаваща запетая и го събира автоматично с другото число, което имаме по-долу.
Прехвърляне на комбинация между число и текст към число и събиране с друго число:
<?php
$a='2sdsaads';
echo $a+2;
?>
В този пример променливата е стринг и тя е приела смесена стойност с число и текст. При събирането ѝ с друга променлива буквите просто са изчезнали и крайният резултат е 4. За да разберете по-добре какво става, ще направим още един пример:
<?php
$a='2sdsaads';
$b=(int)$a;
echo $a+2;
var_dump($b);
?>
Всъщност в този пример имаме променливата $a, към която присъединяваме стринг и след това към променливата $b присвояваме стойността на променливата $a, като караме PHP насила да прехвърли тази стойност към integer. Резултатът от този код в браузъра е 4int(2). Текстът след 2 в променливата $a изчезна, тъй като буквите нямат математически аналози на тези цифри, затова PHP просто ги премахва/изтрива.
Подобно нещо можем да направим и с float, double, както и с другите типове данни в PHP:
<?php
$a='2.55sdsaads';
$b=(float)$a;
echo $a+2;
var_dump($b);
?>
Тук резултатът от var_dump в браузъра е 4.55float(2.55). Виждате, че PHP е направил сметките, премахвайки от крайното сумиране буквите, намиращи се след цифрите в променливата $a.
Какво става, ако числото е на последно място:
<?php
$a='aasdsasa3';
$b=(int)$a;
var_dump($b);
?>
В този пример функцията var_dump ни дава int(0) и това е така поради голяма особеност на програмния език PHP. Когато PHP се опитва да прехвърли от string към числов формат, той преглежда първия символ - ако той е число, го приема, но в момента, в който той види знак, различен от число или десетична запетая, той спира прочитането на целия израз до края. Това може да се разбере още по-добре със следния пример:
<?php
$a='300sadasdsdda9999999';
$b=(int)$a;
var_dump($b);
?>
Резултатът от var_dump в браузъра е int(300). Виждате ,че останалите деветки след буквите, както и самите букви, биват игнорирани. Както можете да видите сами, при това прехвърляне към другия тип данни се губи информация. Това може да се избегне и ще поговорим за това на по-късен етап.
Прехвърляне на число към string, да опитаме със следния програмен код:
<?php
$a=3213;
$b=(string)$a;
var_dump($b);
?>
Ето какво ни дава функцията var_dump в този пример string(4) "3213" - стринг с дължина 4 символа и стойност 3213. При прехвърляне от число към стринг никога не може да стане проблем, защото всяко едно число, без значение какво е, дали е цяло, с плаваща запетая, може да се прехвърли без никаква загуба към стринг.
Някои особености при прехвърлянето от число към текст:
<?php
$a=33.87;
$b=(int)$a;
var_dump($b);
?>
В този пример прехвърляме число с плаваща запетая, в случая стойността на променливата $a, към integer, тоест към цяло число. Резултатът от този код е следния:
int(33). Това е така, защото числото се прехвърля от такова с плаваща запетая към цяло число, а целите числа не могат да имат десетична запетая. Затова PHP изтрива всичко след десетичната запетая, без да се интересува какви стойности има там и без да ги обработва по какъвто и да е начин.
Ако искате да закръгляме стойностите , трябва да използваме функцията за закръгляне, за която ще поговорим малко по-нататък.
Да пробваме да прехвърлим стойността на цяло число към плаваща запетая:
<?php
$a=3;
$b=(float)$a;
var_dump($b);
?>
Тук резултатът, която var_dump ни дава, е float(3). В този случай нямаме загуба на информация и няма как да имаме, тъй като числата с плаваща информация могат да съдържат много повече информация, отколкото целите числа.
Прехвърляне към булева стойност
<?php
$a=8;
$b=(boolean)$a;
var_dump($b);
?>
Резултатът от този код е bool(true).
Ако променливата има стойност 0, тогава резултатът е друг. Кодът ще изглежда по този начин:
<?php
$a=0;
$b=(boolean)$a;
var_dump($b);
?>
Резултатът от този код е bool(false).
Ако имаме стринг, тоест нещо от типа на:
<?php
$a='sadasdasddsadsa';
$b=(boolean)$a;
var_dump($b);
?>
Резултатът от този код е bool(true).
Ако имаме стринг (текст) като число 0, кодът ще изглежда така:
<?php
$a='0';
$b=(boolean)$a;
var_dump($b);
?>
Резултатът от този код е bool(false).
Ако текстът е празен:
<?php
$a='';
$b=(boolean)$a;
var_dump($b);
?>
Резултатът от този код е bool(false).
Ако променливата е празна:
<?php
$a;
$b=(boolean)$a;
var_dump($b);
?>
Резултатът от този код е bool(false).
Винаги ще получите false, ако променливата няма стойност или има стойност 0 като текст или число.
Ето още един интересен пример:
<?php
$a='false';
$b=(boolean)$a;
var_dump($b);
?>
Тук имаме самата дума false, която е като текст (стринг), но резултатът е true.
Тези правила за boolean са изключително важни, защото с boolean се правят изключително важни проверки дали нещо е станало.
В заключение
Когато прехвърляме текст към число, ако текстът започва с число, то бива прехвърлено и всичко след числото бива игнорирано.
Когато прехвърляме число към текст, няма никакъв проблем, няма никаква загуба на информация.
Когато прехвърляме число с плаваща запетая към integer, ние загубваме десетичната стойност.
Когато прехвърляето цяло число към друго с плаваща запетая, няма никаква загуба на информация.
Когато прехвърляте към булева стойност, ще получите false, ако променливата няма стойност или има текст 0, или числото 0, или ако променливата е записана като празен стринг, което всъщност е празна променлива.