Самообучение PHP училище

Кратко ръководство по PHP за начинаещи


Източник: PC World » Последна редакция: LeoS

Шести урок » (5050 посещения)

Управление на цикъл
PHP предоставя допълнителни възможности за управление на цикъла, чрез break и continue. Те могат да се използват във for, foreach while, do..while или switch (ще разгледаме след малко) конструкциите и дават по-голяма гъвкавост за реакция при определени условия. С тяхна помощ можем да определяме и други условия, влияещи на хода на циклите, които използваме. Вижте този пример :

for ($i = 1; $i <= 100; $i++) {
if ($i==3) continue;
if ($i==$a) break;
echo "Това е ред ".$i."<br>";
}

При изпълнението на този код, на екрана ще се изпише изречението не 100 пъти, а толкова, колкото укажем в променливата $a. Използвайки break можем да прекъснем изпълнението на определен цикъл при възникване на условие, различно от основното. В случая основното условие е стойността на променливата $i да е по-малка от 100. Но тук добавихме по-голяма гъвкавост, като посочихме допълнително условие, което може да прекъсне цикъла.
Друга особеност в горния код е, че в изхода му няма да има ред "Това е ред 3". Използвахме continue за да укажем, че не желаем действията в цикъла да се изпълнят, ако е вярно условието, че стойността на $i е 3. В този случай изпълнението на цикъла продължава нормално, като текущата итерация се прекратява преждевременно.
Трябва да имате предвид, че continue и break действат считано от реда, на който се намират. Нека погледнем този пример :

for ($i = 1; $i <= 100; $i++) {
//някакво действие тук
if ($i==3) continue;
if ($i==$a) break;
echo "Това е ред ".$i."<br>";
}
(В този случай някакво действие, определено в цикъла, ще бъде изпълнено дори, ако стойността на $i е три или е равна на стойността на $a, защото го предхожда.)

switch
Това е друг вариант за управление на изпълнението на скрипта, при който имаме по-голяма възможност да разчитаме на една променлива. От стойността на тази променлива зависи кое точно действие ще бъде изпълнено. Най-удобно ще е да илюстрираме синтаксиса на конструкцията с пример :

switch ($i) {
case "edit":
echo "Редактиране на информацията...";
break;
case "view":
print "Преглед на информацията ";
break;
case "delete":
print "Изтриване на информацията ";
break;
}
(В зависимост от съдържанието на променливата, парсерът ще изпълни съответните действия.)

Съобщения за грешки в PHP
Едно от големите предимства на PHP пред другите скриптови езици са съобщенията за грешка. Те са доста дружелюбни и ясни, и често казват какво точно трябва да се направи, за да се премахне грешката. Ако вземем за сравнение писането на CGI скриптове, при появата на грешка това, което виждате е простото "Error 550 - Internal Server Error". За да се ориентирате къде точно е проблема в сгрешения скрипт, трябва да отворите лога на сървъра, където ще намерите сравнително по-ясно обяснение за грешката. Но често дори и тази информация е по-обща и неясна от необходимото ви.
При PHP положението е по-различно. Тук често ще срещнете съобщения за грешка, които казват какво точно трябва да направите, за да премахнете проблема и на кой ред се намира некоректния код. Можем да разделим грешките в PHP на три категории - синтактични, семантични и логически.
Нека отново напомним как става изпълнението на един PHP скрипт от страна на сървъра. Когато се получи заявка за определен скрипт, сървърът го подава на PHP парсера, който първо го "парсва" (иначе казано "смила") и едва след това изпълнява. Важно е да се подчертае, че парсерът обработва целия скрипт, преди да започне да го изпълнява. На това ниво на предварителна обработка могат да се появят синтактичните грешки. Ако тук всичко е наред, то следва изпълнението на кода, процес при който биха могли да се появят семантичните грешки. Най-сложни за откриване и поправяне са логическите грешки, които не водят до преки съобщения за проблеми, но могат да доведат до некоректно изпълнение на скрипта.

Parse error
Синтактичните грешки се наричат още грешки при обработването (parse error). Нека погледнем следния пример със синтактична грешка:

<?
$ime=Иван"; //липсват кавички пред Иван
echo $ime;
?>

При изпълнението на този код ще получим следното съобщение :
Parse error: parse error, unexpected '"' in /www/httpd/site/parse_error_primer.php on line 2
Виждаме, че на втория ред от кода има синтактична грешка. Ако се вгледаме ще открием, че са пропуснати отварящите кавички на низа, задаващ стойност на променливата "ime". Понякога обаче съобщението за грешка може да ни подведе. Нека погледнем друг пример:

<?
if ($name=="Иван") //липсва { в края на реда
echo "Здравейте, Иван!";
}
else {
echo "Вие не сте Иван!";
}
?>

При изпълнение на този код ще получим съобщение, че съществува грешка на ред 4. Всъщност обаче, истинският проблем е скрит във втория ред, където сме пропуснали отварящата голяма скоба.
Още един подобен пример :

<?
if ($name=="Иван") {
echo "Здравейте, Иван!";
}
else {
echo "Вие не сте Иван!";
            //липсва } в края на сравнението
?>

В този случай се сблъскваме с една от най-влудяващите ситуации, когато парсерът отчита грешка на последния ред от кода, където се намира единствено затварящата комбинация от въпросителна и средна скоба. Най-често този феномен се дължи на пропусната затваряща (}) или отваряща ({) скоба. В конкретния случай сме изтървали скобата, затваряща условието else.
Запомнете, че когато се получи съобщение за грешка при парсването, скриптът изобщо няма да се изпълни. По този начин парсерът се защитава от евентуалните усложнения, които биха могли да настъпят при изпълнение на грешно написания код.

Fatal error
Фаталните грешки са една от разновидностите на семантичните. Те се появяват в процеса на изпълнение на скрипта и най-често се причиняват от извикване на несъществуващи и недефинирани функции или файлове.
Да погледнем следния пример :

<?
require "config.php";
if (!$user) {
not_auth();
}
?>

Тук бихме могли да получим фатална грешка по някоя от следните причини - ако не съществува файлът "config.php" или ако в него не е дефинирана функцията not_auth(). Фаталните грешки се изписват на екрана в момента, в който се появят в процеса на изпълнение на скрипта. В този момент и изпълнението се прекратява.

Warning
Предупрежденията са друга разновидност на семантичните грешки. Те също се появяват в процеса на изпълнение, но той продължава и след тях. Предизвикват се от грешки, които не са фатални за цялостния ефект, макар че най-често водят до грешно изпълнение на кода. Нека вземем горния пример, но ще сменим функцията за включване на файл от "require" на "include".

<?
include "config.php";
if (!$user) {
header ("location: login.php");
}
...
?>

В този пример проверяваме дали на променливата $user е присвоена някаква стойност или не. Ако не, тогава препращаме потребителя към форма за идентификация, ако да - продължаваме с изпълнението на скрипта. Нека сега приемем, че файлът config.php не съществува. Понеже сме използвали "include", ще получим предупреждение за невъзможността да се включи указания файл, но изпълнението на скрипта ще продължи.
Фаталните грешки и предупрежденията са съобщения, които трябва да възприемате сериозно, ако искате кода, който пишете наистина да изпълнява предназначението си.

Забележки
Забележките са този вид съобщения, с чиято помощ може да се преборите с логическите грешки в скриптовете си. Под логически грешки се разбират неточности в кода, които де факто не възпрепятстват изпълнението му, но водят до грешни резултати. Те могат да са резултат от грешка на изписването или на недобре съставен алгоритъм. По подразбиране, настройките на PHP за показване на грешки са така направени, че забележките не се изписват на екрана. Това е напълно логично, защото в противен случай не бихме могли да използваме конструкции като тези, показани в горния пример. Ако го изпълните на сървър с PHP, настроен да показва всички грешки, ще получите дълго съобщение за грешка, което твърди, че се опитвате да използвате не инициализирана променлива. Както вече стана дума, променливите в PHP не е необходимо да бъдат обявявани преди да се използват. Тяхното инициализиране става автоматично в момента, в който на променливата се присвоява някаква стойност. В случая ние разчитаме на променливата $user, за да проверим дали посетителят вече се е идентифицирал или не. Ако обаче показването на забележки е включено, тогава ще видим изписаното на екрана съобщение, че се опитваме да използваме недефинираната променлива в случаите, когато потребителят все още не се е идентифицирал.
Използването на забележки е особено полезно в стадиите на тестване на сайта, когато резултатите не са такива, каквито очакваме. Например напълно възможно е да допуснем грешка в името на някоя променлива при писането на кода. Разбира се, това ще причини множество проблеми и няма да ни доведе до желания резултат. Използвайки забележките, можем да открием подобни грешки.