Szukaj na tym blogu

Postaram się przekazać swoje doświadczenia z PHP, oraz innych dziwnych rzeczach, typu MySQL, DB2. Czyli to co umiem. Blogoczytelników o słabych nerwach proszę o nieczytanie tego blogu. Dlaczego? Jeszcze nie wiem. W razie pytań z dziedziny PHP proszę pytać, jest cień możliwości że akurat to wiem. ;)

środa, 23 marca 2011

Jak można skomplikować skrypt (cz.2)

Kto to w ogóle powymyślał nad silnikiem PHP? Tacy programiści którzy stwierdzili po co czytać miliard książek, dokumentacji, chodzić na drogie szkolenia, jak wystarczy przeczytać kilka moich zdań skleconych powiedzmy że po polsku żeby zorientować się w czym rzecz.
Na początek nie podoba mi się możliwość zmiany zmiennych w klasie. Omijając elegancką funkcję która nam to robi. Nie mówię o wywołanie tekstu też ma wiele do życzenia. Kto to będzie pamiętał że w tej klasie tekst znajduje się w zmiennej text. Więc od początku.

W poprzedniej części zrobiłem klasę tekst i w środku funkcje tekst. To jest właśnie __construct z PHP 4 (dla tych co znają C++ konstrukcja siekierą wyrąbana właśnie stąd). W napadzie szału zmienisz nazwę klasy i trzeba wszystko zmieniać. To bez sensu. Dlatego funkcja tekst będzie nazywała się __construct().
Po po drugie po co pisać jakieś funkcje zmieniające zmienne skoro można to zrobić bez nich. To trzeba zmienić. Dlatego panowie od PHP wymyślili hasła public i private. Kiedy użyjesz private $text już jej nie zmienisz, nie wyświetlisz nic. Ona jest dostępna tylko i wyłącznie w klasie. Wadą tego rozwiązania jest obowiązek napisania funkcji wyświetlającą ją, ale co to dla prawdziwego wojownika. Różni ludzie różnie nazywają ta funkcję np. save, print, echo... kto to spamięta. Na szczęście panowie od PHP nie zasypują gruszek w popiele i wymyślili coś takiego jak __toString() (też C++). Teraz wystarczy zrobić echo $tekst i klasa wyświetli się jak zwykły tekst. Oto przykład.

<?php
class tekst{
private $imie = 'Ala';
private $czynnosc = 'ma';
private $zwierz = 'psa';
private $text = '';

public function __construct() {
$this->text = "{$this->imie} {$this->czynnosc} {$this->zwierz}!";
}
public function zmiana($imie= NULL, $czynnosc = NULL, $zwierz = NULL) {
$this->imie = $imie==NULL ? $this->imie : $imie;
$this->czynnosc = $czynnosc==NULL ? $this->czynnosc : $czynnosc;
$this->zwierz = $zwierz==NULL ? $this->zwierz : $zwierz;
$this->__construct();
}
public function __toString(){
return $this->text;
}
}
$tekst = new tekst;
$tekst->zmiana ('Ola');
echo $tekst;
?>


Jak widzimy wszystkie zmienne są prywatne, wszystkie funkcje są publiczne, zmienna $tekst sama się uzupełnia odpowiednim tekstem, oraz wyświetla się ją też prosto. Czy da się to jeszcze skomplikować? Ależ oczywiście że tak. Napiszmy teraz funkcje która będzie dodawać wykrzyknik. Zrobimy ją prywatną, co by byle kto nie dodawał wykrzykników ile wlezie. Oto i on.

<?php
class tekst{
private $imie = 'Ala';
private $czynnosc = 'ma';
private $zwierz = 'psa';
private $text = '';

public function __construct() {
$this->text = "{$this->imie} {$this->czynnosc} {$this->zwierz}";
$this->wykrzyknik();
}
public function zmiana($imie= NULL, $czynnosc = NULL, $zwierz = NULL) {
$this->imie = $imie==NULL ? $this->imie : $imie;
$this->czynnosc = $czynnosc==NULL ? $this->czynnosc : $czynnosc;
$this->zwierz = $zwierz==NULL ? $this->zwierz : $zwierz;
$this->__construct();
}
public function __toString(){
return $this->text;
}
private function wykrzyknik() {
$this->text .='!';
}
}
$tekst = new tekst;
$tekst->zmiana ('Ola');
echo $tekst;
?>


Teraz prosta rzecz jest wystarczająco złożona. Prywatne zmienne nie pozwalają nam na swobodne zmiany przez kogoś, publiczne funkcje które służą do zmian tekstu w sposób kontrolowany, prywatna funkcja która dodaje wykrzyknik i nie może być wywołana celem siania zamętu.
Czy da się jeszcze to skomplikować? Ależ oczywiście. Jest jeszcze __destruct, __unset, __call, __clone... ale to kiedy indziej.
Kiedyś pisząc zadanie w zawodach, gdzie główną wygraną była praca specjalnie nie użyłem konstrukcji jak w ostatnim przykładzie z nadzieją że facet się zorientuje że se jaja robię, nie zorientował się. Za to Ty możesz wykorzystać ten przykład i możesz mieć moją fuchę. ;)

Brak komentarzy:

Prześlij komentarz

Konstruktywne komentarze mile widziane.
Wulgaryzmy, obraźliwe stwierdzenia będą usuwane.