qBlog Quadina w świecie PHP

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.

Komentarze (0) Trackbacks (0)

Brak komentarzy.


Leave a comment

Brak trackbacków.