PHP - Programowanie Strukturalne w PHP
| DZIAŁANIE: | brak działania |
Kod:
brak kodu :P
Ewentualne Objaśnienia:
Zajmijmy się troszkę programowanie tzw. strukturalnym - o co chodzi ?
Najprościej mówiąc chodzi o niemarnowanie i nieobciążanie PHP przez bezsensowne
powtarzanie kodu. Na przykład mamy jakaś wielką witrynę gdzie generalnie wiele
części, stron korzysta z połączenia z bazą MySQL - bez sensowne by było dla
każdego pliku wpisywanie funkcji mysql_connect, mysql_select_db itd itd prawda
?? Albo jeśli zmieniłoby się hasło do bazy danych no to co zmieniać w każdym
pliku te dane eee to daremne ;/
Dlatego robimy sobie tzw dołączenia czyli pliki, w których zawieramy istotne
informacje , funkcje ( widzicie podobieństwo z programowaniem obiektowym ? ).
Pliki te zazwyczaj nazywa się : 'nazwa.inc.php' - na przykład tworzymy sobie
plik db.inc.php - w którym zawieramy połączenie z bazą danych . Często tworzy
się również plik z danymi do bazy typu config.inc.php a w nim zmienne dostępu do
bazy ba przykład $db_host, $db_name, $db_user, $db_pass - ten plik dołączamy do
innego, który łączy się z bazą i zmienne z pliku config używane są przez nas w
funkcjach połączenie z bazą.
Tak samo przeróżne funkcje - robimy sobie na przykład zewnętrzny plik
function.inc.php a w nim szereg naszych funkcji, które będą nam potrzebne w
serwisie i elegancko tylko tam gdzie chcemy odwołujemy się do danej funkcji - a
nie powtarzamy wielokrotnie ten sam kod.
Do dołączania plików napewno kojarzycie funkcje : include oraz
require, ale to nie jedyne funkcje służące do tego. Tak więc najważniejsze 4
to :
- include - dołącza plik - ale jeżeli pliku nie da się wstawić (nie
ustnieje, brak uprawnień do jego odczytu itd) pojawi się ostrzeżenie, ale kod
będzie wykonywany dalej
- require - działa jak include, ale w przypadku gdy nie da się pliku
wstawić - pojawi się ostrzeżenie i przestanie być wykonywany kod. Więc jeżeli
nasz skrypt nie może działać bez dołączonego pliku warto użyć require w innych
wypadkach zalecam include
- include_once - działa jak include, ale jeżeli dany plik został już
wcześniej dołączony ( przez inny stronę itp ) - zostanie instrukcja ta
zignorowana
- require_once - jak wyżej, tylko działa jak require
Dość ciekawą rzeczą przy dołączaniu plików jest instrukcja PHP - return . Na przykład mamy taki kod :
<a href="dodaj_art.html">Dodaj artykul</a><br>
<a href="dodaj_link.html">Dodaj link</a><br>
<?
if ( !$admin )
{
return;
}
?>
<a href="admin-1.html">Dodaj użytkownika</a><br>
<a href="admin-2.html">Zarządzaj hasłami</a><br>
Powiedzmy, że jest to jakiś dołączany plik - są to przykładowe na szybko
wymyślone opcje - dodawanie artykułu oraz linku - ale dalej pojawia się kod PHP
- sprawdza on czy zmienna $admin ma wartość 0 - jeżeli tak oznacza to, że jest
to zwykły użytkownik ( nie administrator ) [ oczywiście gdzieś wcześniej w
kodzie jest jakaś autoryzacja poprzez sesje itp, która ustawia zmienną $admin na
1 po poprawnym zalogowaniu administratora ] - wtedy przerywane jest wykonywanie
kodu dołączonego pliku, następuje powrót do pliku głównego.
Identycznie można było po prostu zamiast return dać : if ($admin) { // tutaj
opcje admina }; - działanie takie samo, wg mnie nawet lepsze, ale warto pamiętać
o funkcji return zawsze kiedyś może się Wam przydać.
Ważnym elementem w programowaniu strukturalnym są funkcje - znacie już
to zagadnienie i wiecie jak je tworzyć. Jednak wspomnę o kilku rzeczach, których
wcześniej nie pokazywałem.
- ważne jest to, że w strukturalnym częstym błędem jest deklarowanie takich
samych zmiennych w głównym pliku jak i dołączanym - wtedy następuje błąd bo
pojawiają się 2 takie same zmienne, jedna z nich nadpisuje drugą - to prowadzi
do błędów. Funkcje oczywiście nas chronią przed takimi błędami - zmienne
wewnątrz funkcji obowiązują tylko w ich wnętrzu, ciele nie wchodzą w problem ze
zmiennymi zewnętrznymi - czyli zmienne tzw. globalne z naszego głównego
programu i są one niedostępne wewnątrz funkcji. Czyli możemy mieć śmiało zmienne
na przykład $wynik zarówno wewnątrz funkcji jak i w programie głównym.
- czasem jednak jest pewna potrzeba użycia zmiennej z zewnątrz wewnątrz naszej
funkcji i co wtedy ? Tak więc jeżeli chcemy użyć zmiennej globalnej wewnątrz
funkcji używamy operatora global albo tablicy $GLOBALS .
Przykładowo : mamy gdzieś połączenie do bazy danych poprzez zmienną $connect,
czyli :
$connect = mysql_connect('localhost','root','krasnal');
No i dalej piszemy sobie jakąś funkcję, która ma korzystać z bazy danych więc musi się z nią połączyć więc wewnątrz więc stosujemy sobie słowo global :
function jakasfunkcja()
{
global $connect;
$wynik = mysql_query ('SELECT * FROM tabela', $connect);
// dalsza cześć funkcji
}
lub też tablicę :
function jakasfunkcja()
{
$wynik = mysql_query ('SELECT * FROM tabela', $GLOBALS['connect']);
// dalsza cześć funkcji
}
Tablica $GLOBALS to specjalna tablica o zasięgu wszędzie, zwana
superglobalną . Inne superglobalne to : $_SERVER, $_GET, $_POST, $_COOKIE,
$_FILES, $_REQUEST, $_ENV, $_SESSION - większość z nich już znacie.
Ważne jest to, że jeżeli zimprotowana zmienna ( globalna wewnątrz funkcji )
zostanie zmodyfikowana, czyli jej wartość wewnątrz funkcji się zmieni - zmieni
się również poza funkcją.
Kolejna istotna sprawa to tzw. zmienne statyczne - czasem chcemy stworzyć w funkcji zmienną, która będzie raz określona - czyli określamy tylko za pierwszym wywołaniem funkcji jej wartość na przykład na 0 - gdzieś dalej w kodzie ją inkrementujemy i przy ponownym wywołaniu tej funkcji wartość jest taka jak po wykonaniu wcześniejszym tej funkcji, przykład :
<?
function licz()
{
$ile =0;
++$ile;
print "Byłeś tutaj $ile razy<br/>";
}
licz();
licz();
licz();
?>
W wyniku takiego kodu pojawi się nam na ekranie :
Byłeś tutaj 1 razy
Byłeś tutaj 1 razy
Byłeś tutaj 1 razy
Czyli nie o to nam chodziło prawda ? Za każdym wywołaniem funkcji zmienna $ile jest ustawiana na 0 a potem inkrementowana i wyświetlany jest tekst z wartością 1 tej zmiennej. Dlatego trzeba nam słowa static, zobaczmy :
<?
function licz()
{
static $ile =0;
++$ile;
print "Byłeś tutaj $ile razy<br/>";
}
licz();
licz();
licz();
?>
W wyniku tego kodu pojawi się nam na ekranie :
Byłeś tutaj 1 razy
Byłeś tutaj 2 razy
Byłeś tutaj 3 razy
W tej sytuacji wartość zmiennej jest ustawiana tylko raz na 0, przy następnych wywołaniach funkcji jest brana pod uwagę wartość istniejąca ( po poprzednim wywołaniu funkcji )
Kolejna ciekawa rzecz odnosząca się do funkcji jest określanie
opcjonalnych i nieograniczonych ilości argumentów danej funkcji .
- najprostszy przykład mamy funkcję na obliczanie pola prostokąta - ale czasem
prostokąt jest kwadratem więc szkoda podawać ten sam argument ( bok ) dwa razy -
wystarczy raz prawda - więc uczynimy drugi z argumentów jako opcjonalny - jeżeli
go nie podamy przyjmie on wartość domyślną czyli :
function poleprostokata ($x, $y = -1)
{
if ($y < 0)
{
$y=$x;
}
return $x*$x;
}
Proste nie ? Jeżeli nie podamy argumentu drugiego - przyjmie on wartość -1,
wtedy jak widać dalej argument drugi przyjmuje wartość pierwszego.
Należy pamiętać, że argumenty opcjonalne muszą się znajdować na końcu listy
argumentów .
Kiedy tworzymy funkcję o nieokreślonej - nieograniczonej ilości argumentów robimy tak ( 2 opcje ) :
<?
function suma()
{
$numargs = func_num_arg();
$suma = 0;
for ($i=0; $i<$numargs; $i++)
{
$suma += func_get_arg($i);
}
return $suma;
}
// obliczamy coś
print suma().'<br/>';
print suma(1,4).'<br/>';
print sima(555,455).'<br/>';
?>
Na ekranie ujrzymy wyniki : 0, 5 oraz 1010 . Tworzymy funkcję nie podając w
nawiasach argumentów oraz korzystamy z dwóch funkcji :
- func_num_arg - zwraca liczbę argumentów podanych do bieżącej funkcji ;
- func_get_arg(numer_argumentu) - zwraca wartość konkretnego argumentu
bieżącej funkcji, czyli func_get_arg(0) wartość pierwszego itd. ;
Druga opcja to użycie pętli foreach :
<?
function suma()
{
$suma = 0;
foreach ( func_get_args() as $argument )
{
$suma += $argument;
}
return $suma;
}
?>
Tutaj używamy funkcji func_get_args - zamiast jednego zwraca wszystkie argumenty przekazane do funkcji w formie tablicy ( czyli tutaj jest to tablica $argument ). Proste prawda ? Obie metody są w porządku jakiej wy zechcecie używać do zależy już od Waszego widzi mi się !
To powiedzmy wszystko - teraz dla przykładu zrobimy logowanie z wykorzystaniem programowania strukturalnego .