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 .