Test wiedzy
Postaram się zaprezentować w dzisiejszym artykule sposób na proste określenie na jakim poziomie się znajdujesz w tym momencie. Dla przykładu weźmiemy prostą aplikację, a raczej moduł - licznik odwiedzin strony. Kolejne stopnie wtajemniczenia to nic innego jak zwiększanie i utrudnianie samemu sobie tworzenia prostego licznika. Utrudnianie takie da wymierny efekt zrozumienia pewnych aspektów programowania i pokaże Ci jak bardzo zaawansowany jesteś, a co jest jeszcze przed Tobą. Nie zajmiemy się tutaj zagadnieniem baz danych, zajmiemy się bazami w zupełnie innym miejscu.
Przypominam, że artykuł ten nie jest jeszcze lekcją, więc nie będę poruszać zagadnień w nim użytych. Określamy tylko gdzie jesteśmy
Stopień pierwszy
Licznik odczytujący daną z pliku tekstowego zwiększający licznik o jeden, zapisujący odpowiednią wartość i ostatecznie zapisujący do pliku.
// użycie $nazwa_pliku = 'licznik.txt'; $plik = fopen($nazwa_pliku,'r'); $licznik = fread($plik); fclose($plik); $licznik++; $plik = fopen($nazwa_pliku,'w+'); fwrite($plik, $licznik); fclose($plik); //wyświetlane echo $licznik;
Wady: Licznik zwiększa swoją wartość co wyświetlenie strony; potrzebuje już utworzonego pliku z wartością początkową; niestabilność przy większym obciążeniu spowodowana brakiem jakichkolwiek zabezpieczeń.
Stopień drugi
Licznik wykonujący operacje na plikach przy pomocy funkcji, zapamiętuje swoje użycia w sesji, więc zwiększa się nie co wyświetlenie strony, a co odwiedziny (np. co dziennie, co 2-3h - w momencie wygaśnięcia sesji).
//funkcje
function plik($nazwa,$zapis=null){
if($zapis!==null){
$licznik = 0;
$plik = fopen($nazwa_pliku,'r');
if($plik){
$licznik = fread($plik);
fclose($plik);
}
return $licznik;
} else {
$plik = fopen($nazwa_pliku,'w+');
fwrite($plik, $licznik);
fclose($plik);
}
}
//użycie
$nazwa_pliku = 'licznik.txt';
$licznik = plik($nazwa_pliku)+1;
if(!isset($_SESSION['licznik'])){
$_SESSION['licznik'] = $licznik;
plik($nazwa_pliku,$licznik);
}
//wyświetlanie
echo $licznik;
Wady: toporny sposób użycia danych; brak zabezpieczeń przeciwko dużemu obciążeniu;
Stopień trzeci
Użyjemy tutaj funkcji blokujących odczyt oraz zapis pliku, oraz skrócimy zapis do optimum, to jest środek między czytelnością a ilością kodu.
//funkcje
function licznik($zapis=null,$nazwa='licznik.txt'){
if($plik = @fopen($nazwa_pliku,$zapis?'w+':'r')){
if($zapis){
flock($plik,LOCK_EX);
@fwrite($plik,$zapis);
} else {
flock($plik,LOCK_SH);
$zapis = @fread($plik);
}
flock($plik,LOCK_UN);
fclose($plik);
}
return $zapis;
}
//użycie
$licznik = licznik();
if(!isset($_SESSION['licznik'])){
$_SESSION['licznik'] = licznik($licznik+1);
}
//wyswietlanie
echo $licznik;
Wady: programowanie liniowe; brak kontroli ponownego naliczenia licznika w czasie; konieczność użycia kilku linijek w kodzie.
Stopień czwarty
Tutaj zaczyna się wymyślanie problemów trochę przy tego typu prostym module jak licznik odwiedzin, ale zaczynamy pokazywać techniki zaawansowane, czyli obiekty i ich potęgę.
//funkcje
class licznik {
private $licznik = 0;
private $nazwa_pliku = '';
public function licznik($nazwa='licznik.txt'){
$this->nazwa_pliku = $nazwa;
$this->licznik = $this->plik();
}
public function zwieksz(){
$this->plik($this->licznik+1);
}
public function pokaz(){
return $this->licznik;
}
private function plik($zapis=null){
if($plik = @fopen($this->nazwa_pliku,$zapis?'w+':'r')){
if($zapis){
flock($plik,LOCK_EX);
@fwrite($plik,$zapis);
} else {
flock($plik,LOCK_SH);
$zapis = @fread($plik);
}
flock($plik,LOCK_UN);
fclose($plik);
}
}
}
//użycie
$licznik = new licznik;
if(!isset($_SESSION['licznik'])){
$_SESSION['licznik'] = $licznik->zwieksz();
}
//wyswietlanie
echo $licznik->pokaz();
Wady: konieczność użycia kilku linijek kodu w trakcie wykonywanej akcji;
Zalety: brak możliwości przypadkowego zmodyfikowania wielkości licznika; możliwość tworzenia wielu liczników przy pomocy tej samej klasy.
Stopień piąty
Przekształcimy nasz obiekt w taki sposób, aby sam zajmował się ustaleniem, czy był już użyty w danej sesji czy nie. W ten sposób wywołanie minimalizujemy do maksimum i zwiększamy możliwości wielokrotnego używania go na stronie w różny sposób. Dodajemy funkcję magiczną.
<?php
class licznik {
private $licznik = 0;
private $nazwa_pliku = '';
public function licznik($nazwa='licznik.txt'){
$this->nazwa_pliku = $nazwa;
$this->licznik = $this->plik();
}
public function zwieksz(){
$this->plik($this->licznik+1);
}
public function pokaz(){
return $this->licznik;
}
private function plik($zapis=null){
if($plik = @fopen($this->nazwa_pliku,$zapis?'w+':'r')){
flock($plik,$zapis?LOCK_EX:LOCK_SH);
if($zapis){
@fwrite($plik,$zapis);
} else {
$zapis = @fread($plik);
}
flock($plik,LOCK_UN);
fclose($plik);
}
}
public function __toString(){
return $this->pokaz();
}
//funkcje statyczne
public static function getLicznik($nazwa='licznik.txt'){
if(!isset($_SESSION['licznik_'.$nazwa])){
$l = new licznik($nazwa);
$l->zwieksz();
$_SESSION['licznik_'.$nazwa] = $l;
}
return $_SESSION['licznik_'.$nazwa];
}
}
//użycie
$licznik = licznik::getLicznik();
//wyswietlanie
echo $licznik;
Wady: Obszerność kodu;
Zalety: Duża uniwersalność kodu; użycie w jednej linijce oraz wyświetlanie jak zwykłej zmiennej (pomocne przy współpracy z grafikami nie mającymi pojęcia o PHP, ale modyfikującymi szablony);
Podsumowanie
Jeżeli przebrnąłeś przez wszystkie pięć kroków i rozumiesz 100% z treści tutaj zawartej to prawdopodobnie moje artykuły będą jedynie przypomnieniem dla Ciebie wiedzy na temat programowania w PHP. Jeżeli nie rozumiesz już pierwszego stopnia, to znaczy, że mamy jeszcze długą drogę przed nami do dojścia do profesjonalizmu. Natomiast jeżeli łapiesz się w kodzie poziomu dwa i trzy, to nie jest źle - poćwiczymy trochę, nauczymy się dobrych manier i zwyczajów w programowaniu dochodząc do perfekcji.
Zapraszam do komentowania, oraz dzielenia się swoimi wynikami w tym czysto teoretycznym teście umiejętności. Na wszelkie pytania oczywiście odpowiem tak szybko jak będzie to tylko możliwe.