Правилно структуриране на PHP

Автор: eddyy93
Здравейте туристи.
Забелязал съм, че доста от вас ползвате ob_start(); и маскиране на грешките в кодовете. В този урок ще се опитам да ви обясна какво представляват тези 2 метода който ползвате и как да ги избягваме, също така и как да структурираме правилно един код, за да бъде той по четлив и оптимизиран.
Първо да започнем с какво представлява ob_start();
- ob_start(); (output buffering) е функция която, чете целият ви написан код и го пренарежда по стандартите. Обаче това си има и своят минус.
Разгледайте го така: За да ви зареди страница която вие сте избрали и на нея се съдържа тази функция, то първо страницата се зарежда от функцията (1 път), после кода се нарежда (1 пъти) и най-накрая се изпълнява през функцията, тоест един вид страницата ви се презарежда 3 пъти, това означава ли, че функцията ви забавя страниците x3 ? Да, забавя е и то значително при по-големи файлове с повечко код.
- Пример за ob_start();:
<?php
echo 'some text';
session_start();
echo 'some more text';Този код по стандарт, би ни изкарало грешка от типа: „headers already been sent“.
Но ако го напишем:
<?php
ob_start();
echo 'some text';
session_start();
echo 'some more text';Грешка няма да получим, заради това, че функцията ни пренарежда кода, по ето този вариянт (давам като пример да разберете как работи самата функция) :
<?php
session_start();
echo 'some text';
echo 'some more text';Но, за да се получи тази структура, трябва да се изпълни:
- Преглед на целият код.
- Нареждане на кода.
- Показване на готовият за вас вид на кода през функцията.
Малко по-надолу в урока ще ви обясна защо дава тази грешка с headers и как да е избегнем без ob_start();
„Скриване на грешки“
- Скриването на грешки не ви решава проблемите!
Скриване на грешки от типа:
error_reporting(0)
@
И премахване от php.ini
Говорят само за един доста на бързо написан и не добре структуриран код, може и в някой моменти да се говори дори и за не добре защитен код.
- Защо да не премахваме грешките?
Грешките са тези който в даден момент ти помагат да разрешиш даден проблем, който всъщност не можеш да откриеш в случай, че си стартирал функциите за „маскиране“ на грешки. - Забавя ли зареждането на страницата ви?
И това както и ob_start(); Забавя зареждането на страницата. - Как да не пропускаме грешки?
Като за начало не слагайте функции като error_reporting(0) за маскиране на грешките, защото вие не подобрявате кода, а го забавяте още и грешките са в сила все още.
„@“ – Маймунското „А“. Предполагам всички знаете, че ви скрива грешки възникнали на даден ред от кода. Как да го избягваме?
Това става с проверки if .. else
Пример за взимане на информация от форма:
if($_POST['submit']) {
//код
}При този вариянт ако всичко на хоста ви е по „defalut“ (както се нарича), ще получите грешка при първоначално стартиране на кода: Unidentified variable.
Защото променливата $_POST не се е индентифицира никъде. Обаче при натискане на бутона „submit“ тази грешка, ще ви изчезне, защото вече ще е индентифицирана.
Сега тази грешка може да бъде маскиране с „@“ ето така:
if(@$_POST['submit']) {
//код
}Но, това не ви решава проблема, грешката продължава да е в действие, макар че не се показва.
Обаче за пълното решение на този проблем, може да ползваме функцията „isset()“, тази функция проверява дали тази променлва е индентифицира и ако не е връща „false“ и проверката минава за невалидна, а не да върне грешка.
Ето така:
if(isset($_POST['submit'])) {
//код
}Разбира се тази функция, може да се ползва и за други променливи (глобални и не глобални).
Пример за още един вид маскиране с „@“ или с „error_reporting(0)“.
Е когато изкарвате информация от даден файл. И ако този файл не съществува ви връща грешка.
Винаги може и на него да се направи проверка от този тип:
if (file_exists($filename)) {echo 'file exist'}Като правило е да описвате всичко което правите. Да проверявате дали дадено нещо съществува дали е индентифицирано, ако дадена функция да кажем не връща стойност, трябва да и зададем нещо като алтернатива в този случай, като пример „null“ стойност.
Мисля, че до тук разгледахме в общи линии за грешките, и тяхните маскирания като ob_start(); и маскиране на грешките.
Правилно структуриране на кода, за избягване на грешки и ob_start();
- Сега разглеждайте един файл да кажем index.php като 2 части.
- – ва: PHP кодът (който седи най-отгоре на страницата).
- – ра: HTML кодът (който седи надолу в страницата).
- Когато пишете вашият код смесено като пример:
<html>
<head></head>
<body>
<h2>Hello</h2>
<?php
session_start();
$_SESSION['smth']='text';
?>
</body>
</html>Това ще ви върне грешка, че „headers already been sent“ – в превод, че имаш вече изпратена сървърна информация към клиента (не съм със сигурност дали това е точното определение).
Тази грешка се дължи на това, че преди session_start(); Имаш написани тагове или текст. И следователно щом имаш написани тагове или текст, всичко след първият ТАГ или ТЕКСТ не се счита вече за тази „първоначална информация която се праща към клиента“ и когато дойде реда на session_start(); сървъра се опитва да изпрати информация за стартиране на сесии, обаче няма как да се стартират сесиите, тъй като те се водят от този вид „първата информация (сървърната)“ и се връща грешка.
Сега как да избягваме този вид грешки:
- -во: Запомнете, че всички функции свръзани към headers (главните части), се пращат преди всеки таг или текст (тоест те се пишат първи в файла).
Примера от горе, без никъкви грешки, ще изглежда така:
<?php session_start(); ?>
<html>
<head></head>
<body>
<?php
echo '<h2>Hello</h2>';
$_SESSION['smth']='text';
?>
</body>
</html>Сега написах „<h2>Hello</h2>“ в PHP и ECHO, какво искам да ви кажа:
Някой ползват ето този стил на писане:
<?php //kod ?><img src='<?php echo 'some text' ?>' height='<?php echo $width ?>' width='100px' /><?php //kod ?>Не казвам, че е лошо. Но просто е нечетливо, и може би това отваряне затваряне на PHP, забавя до някъква степен кода (не съм сигурен за това със забавянето, ! мое предположение !).
Искам да ви каже, че иматели динамични места като примерно този код за снимки е хубаво целият ред да бъде вкаран в echo.
- -ро: Сега едно от важните неща за структуриране на кода е имено това как да разделите PHP от HTML.
- Като за начало искам да почна с това, че над тага се извършват всички действия който желаете да бъдат извършени с PHP – там няма echo „“ да пускате и други видове показване на текст. Само действията. Самото показване става в ТУК . Като информацията ще е прехвърляте с променливи. Това помага на действия като header(); за препращане и помага за по нагледен код. Също така това, ще бъдат действия който браузера ще зареди първи и от там надолу страницата няма да ви забавя своето отваряне.
Ето пример за една POST форма за коментари да кажем:
<?php
session_start();
if(isset($_POST['submit'])){
$greshka=array();
if(empty($_POST['name']) || empty($_POST['komentar']))
{$greshka['1']=true;}
else {
$inrow=mysql_query("INSERT INTO");
if($inrow)
{
header("Location: index.php");
exit;
}
}
}
?>
<html>
<head></head>
<body>
<form method='post' action='index.php'>
<br>
<input type='text' name='name' />
<br>
<textarea name='komentar' rows='20' cols='10' ></textarea>
<br><br>
<input type='submit' name='submit' value=' SEND ' />
<br>
</form>
<?php if(isset($greshka['1'])) {echo 'Не може да оставяте празни полета';} ?>
</body>
</html>
Ето как изпълних този код:
В началото на файла проверявам дали формата е изпратена ако е изпратена, проверявам дали полетата са празни ако не са – записвам в базата данни и препращам към index.php (тоест към същият файл). Сега ако са празни полетата, не слагам echo веднага ами го вкарвам в променлива или в масив ако са повече грешки и го зареждам долу под формата.
Написал съм и също в началото един session_start(); – в този момент не ми трябва, но искам да ви покажа къде трябва да му е мястото.
Разбира се ако дори напишете всичко след (заедо с него) в едно „echo“, няма да се счита за грешка. Избягвайте само постоянното отваряне и затваряне на „<?php“ „?>“.
Мисля, че е това е достатъчно. Оставяйте коментари, сигнализирайте ако имам грешки и се надявам да съм помогнал на поне някого.


