Първи стъпки в PHP — част 2

В предния урок споменахме за основните типове променливи в PHP. Тук ще разгледаме някои основни операции и особености свързани с тях.

Няма да се впускам в особени обяснения за условия и др подобни. Те са кажи-речи еднакви във всички C-базирани езици. Вече би трябвало да ги знаете от JavaScript уроците.

Да започнем с това, че променлива в PHP се инициализира още в момента, в който за първи път ѝ зададем стойност.

Грешки при недефинирани променливи

Ако се опитаме да използваме променлива в сравнение или друга операция, преди тя да е била инициализирана, това няма да прекрати script-а ни. Все пак ще хвърли грешка от тип Notice. Повечето сървъри са настроени така, че изобщо да не показват този тип грешки. Въпрос на качествено програмиране е все пак да не ги генерираме.

Ако имаме:

<?php
echo $a;
?>

Това ще даде грешка: Notice: Undefined variable: a in file.php on line 2

Правилният начин да го направим е:

<?php
$a = 'Hello World';

echo $a;
?>

Резултатът ще бъде изписването на текста “Hello World”.

Какво точно прави “echo“?

Това е команда, която конвертира към тип string всичко, което е изписано след нея и го извежда. Под “извежда” се има предвид, че ако вмъкнем този код в някоя HTML страница, след изпълнението му, на мястото ще бъде изведен този текст. Така че, ако имаме:

<h1><?php echo 'Hello World!'; ?></h1>

Това, което ще стигне до браузъра след парсирането на PHP кода от сървъра е:

<h1>Hello World!</h1>

Конкретно този пример е малко безсмислен, тъй като няма нужда от PHP за да изпишем този текст. Но ако той беше генериран програмно използвайки база данни или нещо друго, тогава вече щяхме да можем да сменяме това заглавие.

URL параметри / GET аргументи

За да го направим малко по-интересно можем да използваме подаване на променливи към script-а чрез URL, през който го достъпваме.

Ако страницата ни е на http://localhost/test.php, то можем да подадем GET аргумент като добавим “?” след URL-а на страницата. Това отделя query частта в цялостния URL. След това напишем ключ на променлива, последвана от знак за равенство и стойност. Нещо такова: http://localhost/test.php?name=Georgi

Подобни GET аргументи можем да достъпим през PHP с помощта на $_GET суперглобалната променлива, чиито тип е масив.

Масиви в PHP

Преди да покажем нов пример, който да използва GET аргументи, нека кажем няколко думи за синтаксиса на PHP относно масивите.

Нов масив се създава чрез функцията array(). Стойностите на масива се изреждат чрез запетаи:

$my_array = array(1, 2, 3, 4);

Можем да добавим нов елемент към масива по следния начин:

$my_array = array(1, 2, 3, 4);
$my_array[] = 5;

Това ще добави пети елемент към масива.

Масивите в PHP не са ограничени да съдържат елементи само от един и същ тип. Така че в един масив можем да имаме и числа, и булеви стойности, и низови литерали, и други масиви, и каквото си поискаме:

Масиви със смесени данни

$my_array = array(1, 2.5, true, 'some string', array('second', 'array', 'inside', 'the', 'first', 'one'));

За да достъпим даден елемент от масива използваме квадратни скоби и индекса на елемента, който искаме да достъпим. Не забравяйте, че бройката е с 0-лев индекс, така че първият елемент е [0]:

$colors = array('red', 'green', 'blue');
echo $colors[1]; // това ще изведе "green"

В PHP съществува и друг тип масиви — асоциативни. Това позволява индексите да не са само числа, но и string-ове:

Асоциативни масиви

$colors = array('red' => '#FF0000', 'green' => '#00FF00', 'blue' => '#0000FF');

Когато описваме кой индекс каква стойност да получи използваме знаците => както се вижда в примера по-горе. В него сме използвали имената на цветовете като ключове, а стойността на елемента от масива с даден ключ е HEX репрезентация на дадения цвят.

$_GET суперглобален масив

$_GET суперглобалната променлива е асоциативен масив, чиито елементи са query параметрите от URL-а на текущата страница. Така че ако разгледаме пак описания по-горе URL: http://localhost/test.php?name=Georgi в този случай в $_GET бихме имали елемент с ключ name, чиято стойност е Georgi:

if ($_GET['name'] == 'Georgi') {
	echo 'Hello Georgi!';
} else {
	echo 'Hello Stranger';
}

Горният пример ще изведе “Hello Georgi”, ако използваме примерния URL.

За да го направим по-интересно можем да програмираме script-а да казва “Hello” и въпросното име, каквото и да е то. За целта тряба да конкатенираме string-овете.

Конкатениране в PHP

В PHP това се прави не чрез “+”, като в повечето други C-базирани езици, а с точка — .:

echo 'Hello' . $_GET['name'];

Единични и двойни кавички

PHP има възможност да покаже стойността на дадена променлива, ако сме я вписали директно между двойни кавички. Наблягам на това, че кавичките трябва да са двойни, а не единични като в горния пример.

Макар в другите езици да няма разлика между низове с единични и двойни кавички, в PHP единични ще покажат точно каквото има в тях. Двойните, от друга страна, ще изведат стойността на променлива, ако такава е била подадена.

Двойните кавички имат и други особености — те парсират и знак за нов ред — \n или таб — \t. Ако изпишем тези в единични кавички, то ще видим просто същите знаци.

Ако в израз с двойни кавички искаме да включим друга двойна кавичка, или аналогично с единични, можем да я escape-нем с \:

echo 'Say \'Hi\'';
echo "Say \"Hello\"";

С тези знания можем да променим горния script на:

$name = $_GET['name'];
echo "Hello $name";

Защо първо имаме $name = $_GET['name']?

Заради квадратните скоби и единичната кавичка в масива. Като цяло тези специални знаци са малко проблемни за парсъра на двойни кавички. Затова първо задаваме стойността на друга променлива и използваме нея в string-а.

За щастие има и по-лесен начин, просто трябва да оградим променливата във фигурни (големи) скоби:

echo "Hello {$_GET['name']}!";

До тук добре, но ако в момента отворим страницата без да го има name=Georgi (или някакво друго име в URL-а) ще видим следната грешка: Notice: Undefined index: name in test.php on line 2

Това е защото суперглобалната променлива $_GET няма индекс name, съответно нямаме декларирана променлива.

На production сървъри тази грешка няма да се види, но пак ще останем с текст “Hello !” (заедно с интервала), без да го има самото име. А това не е каквото искаме.

Проверка дали променлива е дефинирана

Нека направим проверка дали наистина са ни подали очаквания аргумент или трябва да изведем друг текст:

if (isset($_GET['name'])) {
	echo "Hello {$_GET['name']}!";
} else {
	echo 'Hello!';
}

С помощта на функцията isset правим проверка дали наистина имаме очакваната променлива. Ако условието върне true всичко е наред и казваме “Здравей” на името, което ни е подадено по URL. Ако обаче нямаме подобно подадено име, то тогава използвайки $_GET['name'] ще изведе грешка, а ние не искаме това. В такъв случай просто казваме едно общо “Здравей”, без да се обременяваме с име.

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

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

Този сайт използва Akismet за намаляване на спама. Научете как се обработват данните ви за коментари.