<?php
function formatCurrencyEuro($value, $symbol='€')
{
$value = trim($value); //usuwamy ewentualne puste miejsca
if (is_numeric($value)){ //sprawdzamy czy wartość jest liczbą
if ($value >= 0){
$output = $symbol . number_format($value,2);
} else {
$output = '-' . $symbol . number_format(abs($value), 2);
}
}
return $output;
}
echo "Do zapłaty jest ".formatCurrencyEuro(23);
echo "Twoje saldo to ".formatCurrencyEuro(-56);
?>
Pokazywanie postów oznaczonych etykietą PHP. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą PHP. Pokaż wszystkie posty
niedziela, 1 listopada 2009
[PHP] Jednakowe formatowanie waluty dla każdej wartości
Jeżeli posiadasz stronę na której często umieszczasz w treści wartości podane w określonej walucie to na pewno chcesz żeby takie wpisy były zawsze w tym samym formacie. Przydaję się to zwłaszcza kiedy wyświetlasz wiele takich wartości np. z bazy danych. Warto zastanowić się wtedy nad napisaniem prostej funkcji, która załatwi tą sprawę za Ciebie. W poniższym przykładzie zostało zastosowane formatowanie z wykorzystaniem dwóch miejsc po przecinku oraz kropki. Również, jeżeli wartość jest na minusie to najpierw wyświetlamy znak minus, następnie walutę oraz wartość. Przykład jest prosty, więc nie wymaga większego tłumaczenia.
środa, 23 września 2009
[PHP] Jak zablokować wgrywanie na serwer plików przekraczających określony rozmiar
Jeżeli posiadamy portal na którym użytkownicy wgrywają na serwer różnego rodzaju pliku na pewno chcielibyśmy wprowadzić limit wielkości plików, które wgrywają. Zakładając, że w naszym formularzu znajduje się input, który wygląda mniej więcej tak:
Możemy dołożyć następujący kod PHP:
Możemy dołożyć następujący kod PHP:
$file_size = $_FILES['plik']['size'];
// podajemy wielkość w Bajtach, więc zakładając że blokujemy wszystko powyżej 500KB
if($file_size < 512000) {
/*
Tutaj kod który zapisuje pliki na serwerze
*/
}
else echo "Plik przekracza 500 KB";
[PHP] Jak wygenerować losowy ciąg znaków - generowanie hasła
Jeżeli chcemy umieścić na naszej stronie skrypt generujący losowe hasła dla naszych użytkowników, możemy to zrobić na kilka sposobów. Poniżej znajduje się prosty i szybki sposób, który polega na zaszyfrowaniu daty i losowej liczby oraz obcięcie wyniku do wybranej długości. Poniżej przykład zastosowania. Zostanie wygenerowane hasło, które ma 9 znaków.
function haslo($limit)
{
return substr(md5(date("d.m.Y.H.i.s").rand(1,1000000)) , 0 , $limit);
}
$new_pass = haslo(9);
niedziela, 6 września 2009
Programowanie obiektowe (cz. 9) - klasa sprawdzająca poprawność maski sieciowej - przykład
Wykorzystując poznane do tej pory wiadomości możemy napisać np. klasę, która będzie sprawdzała poprawność maski sieciowej. Przykład takiej klasy znajduje się poniżej. W komentarzach jest opis. Jeżeli coś jest nie jasne to proszę pytać w komentarzach.
<?php
class Netmask {
private $_netmask;
//funkcja zamieniająca numeryczny adres maski na binarny
private function dqtobin($dqin) {
$dq = explode(".",$dqin);
for ($i=0; $i<4 ; $i++) {
//oktet nie może przekraczać 255. Maska to binarny rząd jedynek lub zer
//Do ciągu binarnego pasuje również 256, więc trzeba je wykluczyć
if ($dq[$i] <= 255) {
$bin[$i]=str_pad(decbin($dq[$i]), 8, "0", STR_PAD_LEFT);
}
else
{
throw new Exception ("Oktet numer $i wynosi $dq[$i], więc jest większy niż 255.");
}
}
return implode("",$bin);
}
//sprawdzamy format zapisu adresu i przypisujemy wartość do właściwości _netmask
public function setNetmask($netmask) {
if (!ereg('^([0-9]{1,3}\.){3}[0-9]{1,3}$', $netmask)) {
throw new Exception ("Format maski $netmask jest nieprawidłowy.");
}
else {
$this->_netmask = $netmask;
}
}
//sprawdzamy binarnie czy maska jest prawidłowa. Maska sieciowa to zawsze binarny rząd jedynek
public function checkNetmask(){
$bin_nmask = $this->dqtobin($this->_netmask); //zamiana na adres binarny, wywołanie metody dqtobin
$bin_nmask_valid=rtrim($bin_nmask, "0"); //usuwamy zera z końca adresu binarnego
if (!ereg("0",$bin_nmask_valid) ){ //jeżeli nie ma już żadnych zer w adresie to maska jest ok
echo "Maska $this->_netmask jest poprawna.";
}
else
{
throw new Exception ("Maska $this->_netmask jest nieprawidłowa.");
}
}
}
//objekt
$objNetmask = new Netmask();
$objNetmask-> setNetmask('1.0.0.0');
$objNetmask-> checkNetmask();
?>
sobota, 25 lipca 2009
Programowanie obiektowe (cz. 8) - ochrona dostępu do zmiennych składowych
W ostatnim poście przypisywaliśmy wartości właściwości. Łatwo można było zauważyć, że do zmiennej zadeklarowanej za pomocą public $name mogliśmy przypisać dowolną wartość (również taką, która kompletnie nie ma żadnego sensu). Taki sposób przypisywania wartości do właściwości uniemożliwia jakąkolwiek weryfikacje poprawności danych ani zaktualizowania jakichkolwiek innych wartości w chwili ustawiania wartości właściwości name.
Można w łatwy sposób obejść tą niedogodność. Wystarczy zawsze implementować właściwości jako funkcje (metody) o nazwach np. getNazwaWlasciwosci(wartosc) lub setNazwaWlasciwosci(wartosc). Tego rodzaju funkcje znane są jako metody dostępowe.
Żeby lepiej poznać ich działanie zróbmy mały przykład:
Tak jak w poprzednim przykładach tworzymy plik class.First.php i wprowadzamy poniższy kod:
Następnie tak jak ostatnio w pliku testfirst.php umieszczamy następujący kod:
W tym przykładzie zmieniliśmy status zmiennej public na private, a do nazwy dodaliśmy podkreślenie. Oczywiście podkreślenie nie jest wymagane, jest jednak zalecaną konwencją nazewniczą zmiennych prywatnych i funkcji składowych. Za pomocą słowa kluczowego private blokujemy dostęp do tej zmiennej spoza klasy lub egzemplarza tej klasy (obiektu). Natomiast mają do niej dostęp metody dostępowe, które z kolei są dostępne z zewnątrz obiektu. Metody te są poprzedzone słowem kluczowym public. Chodzi o metody setName() oraz getName() za pomocą których klasa będzie mogła sprawdzić prawidłowość wartości, przed jej przypisaniem. Jeżeli przesłana wartość nie będzie stringiem lub będzie pusta zostanie wygenerowany wyjątek. Warto też podkreślić, że domyślny poziom dostępności dla każdej funkcji lub zmiennej składowej to poziom publiczny, więc niekonieczne było podawanie słowa kluczowego public przed funkcjami. Jest to jednak dobry nawyk.
Jeżeli chodzi o poziomy dostępności zmiennych składowych to mogą one mieć trzy różne poziomy dostępności: publiczny, prywatny i chroniony. Poznaliśmy już publiczne i prywatne. Wiemy, że zmienne składowe publiczne są dostępne z dowolnego miejsca poza obiektem oraz w obiekcie. Natomiast składowe prywatne są dostępne tylko z poziomu klasy lub egzemplarza klasy. Zmienne składowe chronione to elementy o zastosowaniu wewnętrznym, takie jak uchwyt połączenia z bazą danych lub dane konfiguracyjne. Są one dostępne dla własnej klasy oraz dla klas jej potomnych, czyli w tych które odziedziczyły ich właściwości i metody.
Stosowanie metod dostępowych powinno być w aplikacji standardem nawet w przypadku gdy nie planujemy weryfikować danych. Pamiętajmy aby stosować te metody używając funkcji get i set. Utrzymamy wtedy swoją aplikację w pewnych umownych standardach. Poza tym o ile to tylko możliwe powinno się weryfikować wszelkie wprowadzane dane. Zapobiega to włamaniom oraz próbom hackowania naszej aplikacji. Poza tym można o wiele łatwiej i szybciej dodać testowanie w klasie. Przeniesie się ono na wszystkie obiekty utworzone na podstawie tej klasy.
Można w łatwy sposób obejść tą niedogodność. Wystarczy zawsze implementować właściwości jako funkcje (metody) o nazwach np. getNazwaWlasciwosci(wartosc) lub setNazwaWlasciwosci(wartosc). Tego rodzaju funkcje znane są jako metody dostępowe.
Żeby lepiej poznać ich działanie zróbmy mały przykład:
Tak jak w poprzednim przykładach tworzymy plik class.First.php i wprowadzamy poniższy kod:
<?php
class First {
private $_name;
public function sayWelcome() {
echo "Witaj {$this->getName()}!";
}
public function getName() {
return $this->_name;
}
public function setName($name) {
if (!is_string($name) || strlen($name) == 0) {
throw new Exception("Wartość zmiennej jest niepoprawna");
}
else {
$this->_name = $name;
}
}
}
?>
Następnie tak jak ostatnio w pliku testfirst.php umieszczamy następujący kod:
<?php
require_once('class.First.php');
$objFirst = new First();
$objFirst->setName('Wojtek');
$objFirst->sayWelcome();
//a teraz spróbujemy wygenerować błąd
$objFirst->setName(108);
?>
W tym przykładzie zmieniliśmy status zmiennej public na private, a do nazwy dodaliśmy podkreślenie. Oczywiście podkreślenie nie jest wymagane, jest jednak zalecaną konwencją nazewniczą zmiennych prywatnych i funkcji składowych. Za pomocą słowa kluczowego private blokujemy dostęp do tej zmiennej spoza klasy lub egzemplarza tej klasy (obiektu). Natomiast mają do niej dostęp metody dostępowe, które z kolei są dostępne z zewnątrz obiektu. Metody te są poprzedzone słowem kluczowym public. Chodzi o metody setName() oraz getName() za pomocą których klasa będzie mogła sprawdzić prawidłowość wartości, przed jej przypisaniem. Jeżeli przesłana wartość nie będzie stringiem lub będzie pusta zostanie wygenerowany wyjątek. Warto też podkreślić, że domyślny poziom dostępności dla każdej funkcji lub zmiennej składowej to poziom publiczny, więc niekonieczne było podawanie słowa kluczowego public przed funkcjami. Jest to jednak dobry nawyk.
Jeżeli chodzi o poziomy dostępności zmiennych składowych to mogą one mieć trzy różne poziomy dostępności: publiczny, prywatny i chroniony. Poznaliśmy już publiczne i prywatne. Wiemy, że zmienne składowe publiczne są dostępne z dowolnego miejsca poza obiektem oraz w obiekcie. Natomiast składowe prywatne są dostępne tylko z poziomu klasy lub egzemplarza klasy. Zmienne składowe chronione to elementy o zastosowaniu wewnętrznym, takie jak uchwyt połączenia z bazą danych lub dane konfiguracyjne. Są one dostępne dla własnej klasy oraz dla klas jej potomnych, czyli w tych które odziedziczyły ich właściwości i metody.
Stosowanie metod dostępowych powinno być w aplikacji standardem nawet w przypadku gdy nie planujemy weryfikować danych. Pamiętajmy aby stosować te metody używając funkcji get i set. Utrzymamy wtedy swoją aplikację w pewnych umownych standardach. Poza tym o ile to tylko możliwe powinno się weryfikować wszelkie wprowadzane dane. Zapobiega to włamaniom oraz próbom hackowania naszej aplikacji. Poza tym można o wiele łatwiej i szybciej dodać testowanie w klasie. Przeniesie się ono na wszystkie obiekty utworzone na podstawie tej klasy.
piątek, 24 lipca 2009
Programowanie obiektowe (cz. 7) - dodawanie właściwości
Dodawanie właściwości do klasy jest bardzo prostym procesem. Nie różni się zbytnio od tworzenia zmiennych w kodzie proceduralnym. W programowaniu obiektowym definiujemy właściwość poprzez utworzenie zmiennej na początku deklaracji klasy, w obrębie klamer zawierających ciało klasy. Należy pamiętać, że nazwa zmiennej jest nazwą właściwości, więc jeżeli utworzymy zmienną $speed to właściwość będzie nazywała się speed.
Wróćmy do kodu, który edytowaliśmy wcześniej. Otwórzmy plik class.First.php i wprowadźmy tam następujące zmiany:
Jak wynika z powyższego kody aby utworzyć właściwość klasy First o nazwie name wystarczy zadeklarować zmienną o nazwie właściwości. Aby odwołać się do tej właściwości należy należy użyć tego samego operatora, którym odwoływaliśmy się do metody, czyli ->.
W następnym przykładzie utworzymy obiekt, który będzie odwoływał się do naszej nowej właściwości.
Utwórzmy, więc nowy plik o nazwie testfirst.php o następującym kodzie:
Spróbujmy wykonać powyższy kod. Jeżeli wszystko dobrze zrobiliśmy to w przeglądarce powinien pojawić się komunikat Witaj Wojtek!Witaj Paweł!. Ten przykład powinien dać już ogólne wyobrażenie o działaniu metod i właściwości.
Przy deklaracji właściwości użyliśmy słowa kluczowego public, które służy do określania zmiennych publicznych. Zmienne publiczne będą dostępne dla obiektów i klas spoza klasy, w której ta zmienna występuje. Oznacza to, że będziemy mogli ją wykorzystać w dowolnym momencie. Niektóre zmienne deklarowane w klasie istnieją tylko na potrzeby tej klasy i nie powinny być dostępne z poziomu zewnętrznego kodu. Powyższa przykład umożliwia ustawianie oraz pobieranie wartości właściwości name. Teraz metoda sayWelcome zamiast pobierać parametr, pobiera wartość name właściwości.
Użyliśmy również zmiennej $this, która informuje metodę obiektu, że ma pobrać wartość name dotyczącą bieżącego egzemplarza klasy. Jest to używane kiedy nie znamy zmiennej reprezentującej obiekt. Na podstawie tej klasy mogą być utworzone obiekty o różnych nazwach ale za pomocą zmiennej $this, wiemy, ze chodzi o właśnie przetwarzany obiekt. Widać to wyraźnie w poprzednim przykładzie, gdzie obiekt $objFirst i obiekt objSecond wyświetlają różne komunikaty, mimo że obydwa mają w sobie zawarty kod echo "Witaj $this->name!";. Jednak wcześniej miały przypisane różne wartości właściwości name.
Należy również pamiętać, że dostęp do właściwości wymaga tylko jednego $. Należy napisać $this->name, a nie $this->$name. Zmienna jest deklarowane na początku klasy jao public $name.
Możemy również deklarować zmienne wewnętrzne klasy służące do wykonywania wewnętrznych operacja w klasie. Obydwa rodzaje danych, a więc te publiczne, którym możemy przypisywać różne wartości oraz te do użytku wewnętrznego są nazywane wewnętrznymi zmiennymi składowymi klasy. Więcej na ich temat opowiem w kolejnym poście.
Wróćmy do kodu, który edytowaliśmy wcześniej. Otwórzmy plik class.First.php i wprowadźmy tam następujące zmiany:
<?php
class First {
public $name;
function sayWelcome() {
echo "Witaj $this->name!";
}
}
?>
Jak wynika z powyższego kody aby utworzyć właściwość klasy First o nazwie name wystarczy zadeklarować zmienną o nazwie właściwości. Aby odwołać się do tej właściwości należy należy użyć tego samego operatora, którym odwoływaliśmy się do metody, czyli ->.
W następnym przykładzie utworzymy obiekt, który będzie odwoływał się do naszej nowej właściwości.
Utwórzmy, więc nowy plik o nazwie testfirst.php o następującym kodzie:
<?php
require_once('class.First.php');
$objFirst = new First();
$objFirst -> name = 'Wojtek';
$objSecond = new First();
$objSecond -> name = 'Paweł';
$objFirst -> sayWelcome();
$objSecond -> sayWelcome();
?>
Spróbujmy wykonać powyższy kod. Jeżeli wszystko dobrze zrobiliśmy to w przeglądarce powinien pojawić się komunikat Witaj Wojtek!Witaj Paweł!. Ten przykład powinien dać już ogólne wyobrażenie o działaniu metod i właściwości.
Przy deklaracji właściwości użyliśmy słowa kluczowego public, które służy do określania zmiennych publicznych. Zmienne publiczne będą dostępne dla obiektów i klas spoza klasy, w której ta zmienna występuje. Oznacza to, że będziemy mogli ją wykorzystać w dowolnym momencie. Niektóre zmienne deklarowane w klasie istnieją tylko na potrzeby tej klasy i nie powinny być dostępne z poziomu zewnętrznego kodu. Powyższa przykład umożliwia ustawianie oraz pobieranie wartości właściwości name. Teraz metoda sayWelcome zamiast pobierać parametr, pobiera wartość name właściwości.
Użyliśmy również zmiennej $this, która informuje metodę obiektu, że ma pobrać wartość name dotyczącą bieżącego egzemplarza klasy. Jest to używane kiedy nie znamy zmiennej reprezentującej obiekt. Na podstawie tej klasy mogą być utworzone obiekty o różnych nazwach ale za pomocą zmiennej $this, wiemy, ze chodzi o właśnie przetwarzany obiekt. Widać to wyraźnie w poprzednim przykładzie, gdzie obiekt $objFirst i obiekt objSecond wyświetlają różne komunikaty, mimo że obydwa mają w sobie zawarty kod echo "Witaj $this->name!";. Jednak wcześniej miały przypisane różne wartości właściwości name.
Należy również pamiętać, że dostęp do właściwości wymaga tylko jednego $. Należy napisać $this->name, a nie $this->$name. Zmienna jest deklarowane na początku klasy jao public $name.
Możemy również deklarować zmienne wewnętrzne klasy służące do wykonywania wewnętrznych operacja w klasie. Obydwa rodzaje danych, a więc te publiczne, którym możemy przypisywać różne wartości oraz te do użytku wewnętrznego są nazywane wewnętrznymi zmiennymi składowymi klasy. Więcej na ich temat opowiem w kolejnym poście.
Programowanie obiektowe (cz. 6) - dodawanie metody
Nadszedł czas aby do naszej pierwszej klasy dodać jakieś metody. Niestety jej obecna forma nie jest zbyt użyteczna. Wspominałem wcześniej, że metoda klasy to po prostu funkcja. Zobaczmy więc jak będzie wyglądała pierwsza metoda naszej klasy.
Mamy więc utworzoną pierwszą klasę, która coś robi. Zawiera metodę. Obiekt, który utworzymy na podstawie tej klasy może przywitać każdego kto wywoła metodę sayWelcome. Aby wywołać tą metodę na obiekcie $objFirst należy zastosować operator ->, który umożliwia dostęp do danej metody.
Po wykonaniu powyższego kodu powinien się wyświetlić komunikat Witaj Wojtek!. Operator -> służy do dostępu do wszystkich metod i właściwości obiektu. Należy pamiętać, że mówimy tu o programowaniu obiektowym w PHP. W innych językach można było się spotkać z operatorem kropki (.) jednak w PHP nie występuje on w ogóle.
<?php
class First {
function sayWelcome($name) {
echo "Witaj $name!";
}
}
?>
Mamy więc utworzoną pierwszą klasę, która coś robi. Zawiera metodę. Obiekt, który utworzymy na podstawie tej klasy może przywitać każdego kto wywoła metodę sayWelcome. Aby wywołać tą metodę na obiekcie $objFirst należy zastosować operator ->, który umożliwia dostęp do danej metody.
<?php
require_once('class.First.php');
$objFirst = new First();
$objFirst->sayWelcome('Wojtek');
>
Po wykonaniu powyższego kodu powinien się wyświetlić komunikat Witaj Wojtek!. Operator -> służy do dostępu do wszystkich metod i właściwości obiektu. Należy pamiętać, że mówimy tu o programowaniu obiektowym w PHP. W innych językach można było się spotkać z operatorem kropki (.) jednak w PHP nie występuje on w ogóle.
czwartek, 23 lipca 2009
Programowanie obiektowe (cz. 5) - tworzenie klasy i obiektu
Teraz wprowadzimy już trochę praktyki. Zaczniemy od utworzenia pliku o nazwie class.First.php:
W ten sposób została utworzona nowa klasa o nazwie First. Oczywiście nic wielkiego za jej pomocą nie zrobimy ale przynajmniej wiemy jak zacząć. Wystarczy użyć słowa kluczowego class i podać nazwę klasy. Przyjęło się, że nazwy klas rozpoczynamy wielką literą. Również dobrym nawykiem jest umieszczanie każdej klasy w osobnym pliku i nadawanie nazw w formacie class.Nazwaklasy.php.
Aby utworzyć obiekt należy napisać następujący kod:
Przy tworzeniu nowego obiektu należy upewnić się, że został dołączony plik z klasą. Nowe obiekty tworzymy poprzez użycie operatora new po czym podajemy nazwę klasy oraz parę nawiasów (podobnie jak przy wykonywaniu funkcji). Wynik tej operacji, czyli egzemplarz klasy First zostanie przypisany do zmiennej $objFirst. Od tej chwili można wywoływać metody objektu $objFirst i odczytywać lub ustawiać jego właściwości. Oczywiście muszą one się znajdować w obiekcie.
<?php
class First {
}
?>
W ten sposób została utworzona nowa klasa o nazwie First. Oczywiście nic wielkiego za jej pomocą nie zrobimy ale przynajmniej wiemy jak zacząć. Wystarczy użyć słowa kluczowego class i podać nazwę klasy. Przyjęło się, że nazwy klas rozpoczynamy wielką literą. Również dobrym nawykiem jest umieszczanie każdej klasy w osobnym pliku i nadawanie nazw w formacie class.Nazwaklasy.php.
Aby utworzyć obiekt należy napisać następujący kod:
<?php
require_once('class.First.php');
$objFirst = new First();
?>
Przy tworzeniu nowego obiektu należy upewnić się, że został dołączony plik z klasą. Nowe obiekty tworzymy poprzez użycie operatora new po czym podajemy nazwę klasy oraz parę nawiasów (podobnie jak przy wykonywaniu funkcji). Wynik tej operacji, czyli egzemplarz klasy First zostanie przypisany do zmiennej $objFirst. Od tej chwili można wywoływać metody objektu $objFirst i odczytywać lub ustawiać jego właściwości. Oczywiście muszą one się znajdować w obiekcie.
Programowanie obiektowe (cz. 4) - obiekty
Już wiemy, że klasa jest wzorcem dla obiektu. Na jej podstawie konstruowany jest egzemplarz klasy, czyli obiekt. Działa to podobnie do projektu domu, za pomocą którego można wybudować wiele domów o podobnej budowie, ale różniących się np. wyposażeniem lub kolorem ścian. Obiekt to element konkretny, zbudowany na podstawie wzorca dostarczonego przez klasę. Wracając do naszego przykładu z domem to wiemy, że mając projekt możemy zbudować dom wedle własnych upodobań i wymagań. W programowaniu obiektowym, aby zbudować obiekt posługujemy się klasą. Ten proces nazywa się tworzeniem egzemplarza i wymaga dwóch rzeczy:
Sama klasa nie może mieć przypisanych żadnych wartości do właściwości lub być w jakimś stanie. Proces przypisywania wartości do właściwości dotyczy tylko obiektów. Tutaj również możemy posłużyć się analogią domu. W projekcie nie jest zawarty kolor ścian, rodzaj posadzek, lub jakie panele będą położone. Jest tylko informacja, że istnieją. Podobnie jest z tworzeniem egzemplarza klasy, czyli obiektu. Najpierw musimy go utworzyć, następnie możemy operować na jego właściwościach lub wykonywać jego metody. Klasami manipulujemy podczas pisania programu, natomiast obiektami podczas wykonywania programu.
- Miejsca w pamięci przeznaczonego dla obiektu. PHP przydziela je automatycznie.
- Danych, które zostaną przypisane do właściwości obiektu.
Sama klasa nie może mieć przypisanych żadnych wartości do właściwości lub być w jakimś stanie. Proces przypisywania wartości do właściwości dotyczy tylko obiektów. Tutaj również możemy posłużyć się analogią domu. W projekcie nie jest zawarty kolor ścian, rodzaj posadzek, lub jakie panele będą położone. Jest tylko informacja, że istnieją. Podobnie jest z tworzeniem egzemplarza klasy, czyli obiektu. Najpierw musimy go utworzyć, następnie możemy operować na jego właściwościach lub wykonywać jego metody. Klasami manipulujemy podczas pisania programu, natomiast obiektami podczas wykonywania programu.
środa, 22 lipca 2009
Programowanie obiektowe (cz. 3) - klasy
Jeżeli przyjrzymy się otaczającej nas rzeczywistości okaże się, że występują w niej różnego rodzaju obiekty, takie jak drzewa, samochody, domy, łodzie, zwierzęta, itp. Na przykład samochód ma jakiś kolor, opony, wyposażenie, lub pojemność silnika. To jest jego charakterystyka lub, jak to byśmy określili w terminologii obiektowej, właściwości. Dany samochód potrafi różne rzeczy robić, np. hamować, przyspieszać, trąbić, sygnalizować kierunek, itp. To są jego zachowania, lub w terminologii obiektowej metody. Te cechy i zachowania są wspólne dla wszystkich samochodów. Oczywiście nie oznacza to, że wszystkie samochody są np. czerwone. Chodzi o to, że każdy samochód ma jakiś kolor, jakąś pojemność silnika, itd.
Wracając do programowania obiektowego, jeżeli mówimy o klasie mamy na myśli wspólny zbiór właściwości i metod jakiegoś obiektu, które będzie pasował do wszystkich typów danego obiektu, w tym przypadku samochodu. Właściwości danego obiektu mają nazwę i wartość. Niektóre wartości można zmieniać, a niektóre nie. Jeżeli np. utworzymy klasę Car a w niej takie właściwości jak color i weight to kolor danego samochodu może się zmienić, np. po lakierowaniu ale jego waga się nie zmieni.
Niektóre właściwości obiektu reprezentują jego stan. Stan odnosi się do tych właściwości obiektu, które ulegają zmianie pod wpływem pewnych zdarzeń (metod) a niekoniecznie można je modyfikować bezpośrednio. Np. właściwość maxspeed nie jest wartością stałą. Zależy od nawierzchni po której przemieszcza się samochód, jakości paliwa, pojemności silnika oraz rodzaju opon.
Jeżeli mówimy o metodach w programowaniu obiektowym a mamy za sobą doświadczenie związane z programowanie strukturalnym, to możemy powiedzieć, że metody są od odpowiednikiem funkcji. Podobnie jak funkcje, metody mogą pobierać dowolną ilość parametrów. Niektóre metody przetwarzają zewnętrzne dane, przesłane jako parametry, ale mogą również działać na właściwościach własnych obiektów. Możemy np. utworzyć metodę accelerate, która sprawdzi poziom paliwa naszego obiektu Car i ustali czy przyspieszenie w ogóle jest możliwe. Może również zmienić stan obiektów poprzez modyfikację ich właściwości, np. prędkości samochodu.
Wracając do programowania obiektowego, jeżeli mówimy o klasie mamy na myśli wspólny zbiór właściwości i metod jakiegoś obiektu, które będzie pasował do wszystkich typów danego obiektu, w tym przypadku samochodu. Właściwości danego obiektu mają nazwę i wartość. Niektóre wartości można zmieniać, a niektóre nie. Jeżeli np. utworzymy klasę Car a w niej takie właściwości jak color i weight to kolor danego samochodu może się zmienić, np. po lakierowaniu ale jego waga się nie zmieni.
Niektóre właściwości obiektu reprezentują jego stan. Stan odnosi się do tych właściwości obiektu, które ulegają zmianie pod wpływem pewnych zdarzeń (metod) a niekoniecznie można je modyfikować bezpośrednio. Np. właściwość maxspeed nie jest wartością stałą. Zależy od nawierzchni po której przemieszcza się samochód, jakości paliwa, pojemności silnika oraz rodzaju opon.
Jeżeli mówimy o metodach w programowaniu obiektowym a mamy za sobą doświadczenie związane z programowanie strukturalnym, to możemy powiedzieć, że metody są od odpowiednikiem funkcji. Podobnie jak funkcje, metody mogą pobierać dowolną ilość parametrów. Niektóre metody przetwarzają zewnętrzne dane, przesłane jako parametry, ale mogą również działać na właściwościach własnych obiektów. Możemy np. utworzyć metodę accelerate, która sprawdzi poziom paliwa naszego obiektu Car i ustali czy przyspieszenie w ogóle jest możliwe. Może również zmienić stan obiektów poprzez modyfikację ich właściwości, np. prędkości samochodu.
poniedziałek, 20 lipca 2009
Eric Higgins, webmaster Google, radzi jak przyspieszyć skrypty PHP
Na YouTubie można znaleźć film autorstwa Eric Higginsa na temat przyspieszania skryptów PHP. Jest to krótki filmik i powiem szczerze, że po Google spodziewałem się czegoś konkretniejszego. Co o tym myślicie? Macie jakieś swoje sposoby na przyspieszenie skryptów PHP? Więcej informacji można znaleźć na: code.google.com/speed
Programowanie obiektowe (cz. 2) - podstawowe pojęcia
W tym poście skupię się na ogólnym opisaniu podstawowych pojęć związanych z programowaniem obiektowym. W kolejnych postach zostaną one szczegółowo opisane.
Klasy - są wzorcami lub szablonami dla obiektów. W klasach znajduje się kod definiujący właściwości i metody.
Obiekty - są utworzone egzemplarze klasy, które przechowują wszelkie wewnętrzne dane i informacje o stanie potrzebne dla funkcjonowania aplikacji.
Dziedziczenie - polega na utworzeniu nowej klasy na bazie już istniejącej.
Polimorfizm - oznacza zdefiniowanie danej klasy jako członka jednej lub więcej kategorii klas. Przykładem może być samolot, który zakwalifikuje się do "urządzeń z silnikiem rakietowym" oraz "urządzeń latających".
Interfejsy - interfejsy są pewnym sposobem na określenie metod, jakie ma implementować dana klasa. Przydaje się one w sytuacjach, w których pracuje wiele ze sobą połączonych obiektów, które wywołują między sobą ściśle określone metody.
Hermetyzacja - jest to zastrzeżenie dostępu do wewnętrznych danych obiektu.
Nie przejmuj się jeżeli któreś z tych pojęć jest dla Ciebie nie jasne. Wszystko zostanie opisane szczegółowo w kolejnych postach za pomocą przykładów.
Klasy - są wzorcami lub szablonami dla obiektów. W klasach znajduje się kod definiujący właściwości i metody.
Obiekty - są utworzone egzemplarze klasy, które przechowują wszelkie wewnętrzne dane i informacje o stanie potrzebne dla funkcjonowania aplikacji.
Dziedziczenie - polega na utworzeniu nowej klasy na bazie już istniejącej.
Polimorfizm - oznacza zdefiniowanie danej klasy jako członka jednej lub więcej kategorii klas. Przykładem może być samolot, który zakwalifikuje się do "urządzeń z silnikiem rakietowym" oraz "urządzeń latających".
Interfejsy - interfejsy są pewnym sposobem na określenie metod, jakie ma implementować dana klasa. Przydaje się one w sytuacjach, w których pracuje wiele ze sobą połączonych obiektów, które wywołują między sobą ściśle określone metody.
Hermetyzacja - jest to zastrzeżenie dostępu do wewnętrznych danych obiektu.
Nie przejmuj się jeżeli któreś z tych pojęć jest dla Ciebie nie jasne. Wszystko zostanie opisane szczegółowo w kolejnych postach za pomocą przykładów.
Programowanie obiektowe (cz. 1) - wstęp
Tym postem rozpoczynam serie szkoleń związanych z programowaniem obiektowym w PHP. Tak naprawdę najlepszym sposobem nauczenia się programowania obiektowego jest rozłożenie na części pierwsze jakiejś porządnej aplikacji zbudowanej obiektowo. Jednak aby to móc w ogóle zrobić trzeba mieć już solidne podstawy związane z takim programowaniem. Postaram się jasno wyłożyć te podstawy, zaprezentować kilka ćwiczeń, podać parę przykładów a na końcu wskazać kilka aplikacji, które być wyjściowym przykładem do rozpoczęcia programowania własnych aplikacji. Gotowi? A więc zaczynamy ...
Czym jest programowanie obiektowe?
Niektórzy mówią, że programowanie obiektowe jest po prostu innym sposobem patrzenia na świat. Wszystko może przedstawić za pomocą metod, które dany obiekt wykonuje oraz właściwości, które posiada.
Jak już się domyślisz programowanie obiektowe składa się z obiektów, które posiadają pewne metody oraz właściwości. A skąd się biorą obiekty? Są to po prostu egzemplarze gotowych klas. Można powiedzieć, że klasa jest szablonem dla obiektu. Z jednej klasy można utworzyć dowolną ilość obiektu.
Jeśli chodzi o relacje zachodzące między obiektami to analogią może być przykład budowy domu. Hydraulicy są odpowiedzialni za instalacje wodną. Elektrycy kładą instalację elektryczną. Hydraulicy nie interesują się tym, czy obwód elektryczni w sypialni jest 10-amperowy czy 20-amperowy. Natomiast interesuje ich wszystko to co ma związek z instalacją wodną, więc jeżeli elektrycy wykonują pracę, która ma wpływ na instalację wodną to muszą o tym poinformować hydraulików. Generalny wykonawca domy nie wchodzi w szczegóły pracy każdej grupy pracowników, jednak musi dopilnować aby każdy podwykonawca zrobił to co do niego należy.
Programowanie obiektowe działa podobnie, ponieważ poszczególne obiekty ukrywają przed sobą szczegóły wykonywanych działań. Ważne aby zwracały potrzebne nam dane.
Jeżeli zrozumiesz jak dokładnie działają klasy, obiekty oraz metody, które one wykonują to najtrudniejsza część zrozumienia programowania obiektowego jest już za Tobą. Prawdopodobnie cała trudność zrozumienia tego polega na tym, że koncepcja programowania obiektowego jest sprzeczna z zasadami programowania proceduralnego, czyli programowania korzystającego z funkcji i globalnych struktur danych. Z czasem zauważysz, że programowanie obiektowe ma kilka ogromnych zalet w porównaniu z proceduralnym, a w dużych aplikacjach stało się już standardem.
Czym jest programowanie obiektowe?
Niektórzy mówią, że programowanie obiektowe jest po prostu innym sposobem patrzenia na świat. Wszystko może przedstawić za pomocą metod, które dany obiekt wykonuje oraz właściwości, które posiada.
Jak już się domyślisz programowanie obiektowe składa się z obiektów, które posiadają pewne metody oraz właściwości. A skąd się biorą obiekty? Są to po prostu egzemplarze gotowych klas. Można powiedzieć, że klasa jest szablonem dla obiektu. Z jednej klasy można utworzyć dowolną ilość obiektu.
Jeśli chodzi o relacje zachodzące między obiektami to analogią może być przykład budowy domu. Hydraulicy są odpowiedzialni za instalacje wodną. Elektrycy kładą instalację elektryczną. Hydraulicy nie interesują się tym, czy obwód elektryczni w sypialni jest 10-amperowy czy 20-amperowy. Natomiast interesuje ich wszystko to co ma związek z instalacją wodną, więc jeżeli elektrycy wykonują pracę, która ma wpływ na instalację wodną to muszą o tym poinformować hydraulików. Generalny wykonawca domy nie wchodzi w szczegóły pracy każdej grupy pracowników, jednak musi dopilnować aby każdy podwykonawca zrobił to co do niego należy.
Programowanie obiektowe działa podobnie, ponieważ poszczególne obiekty ukrywają przed sobą szczegóły wykonywanych działań. Ważne aby zwracały potrzebne nam dane.
Jeżeli zrozumiesz jak dokładnie działają klasy, obiekty oraz metody, które one wykonują to najtrudniejsza część zrozumienia programowania obiektowego jest już za Tobą. Prawdopodobnie cała trudność zrozumienia tego polega na tym, że koncepcja programowania obiektowego jest sprzeczna z zasadami programowania proceduralnego, czyli programowania korzystającego z funkcji i globalnych struktur danych. Z czasem zauważysz, że programowanie obiektowe ma kilka ogromnych zalet w porównaniu z proceduralnym, a w dużych aplikacjach stało się już standardem.
sobota, 9 maja 2009
[PHP] Funkcja PHP zamieniająca adres maski na prefiks, np. 255.255.255.0 na 24
Dzisiaj kolejna dawka operacja na adresach sieciowych. Poniżej funkcja zamieniająca adres maski sieciowej na prefiks. Myślę, że komentarz w kodzie wystarczy za wszelkie wyjaśnienia.
- <?php
- function mask_to_prefix($mask)
- {
- for ($i=0; $i<=3; $i++){
- }
- return $mask_prefix;
- }
- echo mask_to_prefix("255.255.255.128");
- ?>
piątek, 8 maja 2009
[PHP] Fukcja PHP zamieniająca adresy IP na ich binarny odpowiednik
Witam po krótkiej przerwie! Pomimo, że nic nie pisałem to nie próżnowałem. Pracy było wiele i na pewno część z niej tutaj przedstawię. Zacznę od krótkiego skryptu napisanego w PHP, który zamienia adresy IP na format binarny.
We wierszu 3 wrzucamy poszczególne oktety do tablicy. Następnie we wierszu 6 zamieniamy liczby całkowite na binarne oddzielając je kropką. Każdy oktet po 8 bitów. We wierszu 8 usuwamy ostatnią, niepotrzebną kropkę w nowym adresie.
- <?php
- function ip_to_binary($ip) {
- for ($i=0; $i<=3; $i++){
- }
- return $result;
- }
- echo ip_to_binary("255.255.255.0");
- ?>
We wierszu 3 wrzucamy poszczególne oktety do tablicy. Następnie we wierszu 6 zamieniamy liczby całkowite na binarne oddzielając je kropką. Każdy oktet po 8 bitów. We wierszu 8 usuwamy ostatnią, niepotrzebną kropkę w nowym adresie.
poniedziałek, 9 lutego 2009
[PHP] Skrypt który wyświetla na stronie kto obchodzi dziś imieniny
Witam wszystkich po małej przerwie.
Dzisiaj zaczniemy od krótkiego i prostego skryptu który będzie ze strony www.calendar.sk/nameday-plplhor.php pobierał kto obchodzi dziś imieniny i wyświetlał na naszej stronie. Ponieważ dane pobierają się z innej strony, skrypt jest całkowicie bezobsługowy. Jedyny wymóg to serwer PHP na linuxie z zainstalowaną przeglądarką lynx która posłuży nam do odebrania kodu źródłowego strony. Następnie za pomocą prostego wyrażenia regularnego odnajdziemy imiona.
Dzisiaj zaczniemy od krótkiego i prostego skryptu który będzie ze strony www.calendar.sk/nameday-plplhor.php pobierał kto obchodzi dziś imieniny i wyświetlał na naszej stronie. Ponieważ dane pobierają się z innej strony, skrypt jest całkowicie bezobsługowy. Jedyny wymóg to serwer PHP na linuxie z zainstalowaną przeglądarką lynx która posłuży nam do odebrania kodu źródłowego strony. Następnie za pomocą prostego wyrażenia regularnego odnajdziemy imiona.
środa, 26 listopada 2008
[PHP] Jak sprawdzić z jakiej przeglądarki i z jakiego systemu korzysta gość naszej strony
Możemy bardzo łatwo sprawdzić z jakiej przeglądarki i jakiego systemu korzysta osoba, która odwiedza naszą stronę. Aby to sprawdzić odczytamy zawartość zmiennej globalnej $_SERVER['HTTP_USER_AGENT']w której znajdują się interesujące nas informacje.
Najpierw za pomocą komendy strtolower() zamienimy wszystkie litery na małe aby łatwiej nam się wyszukiwało informacji o przeglądarce i systemie. Następnie za pomocą strpos() sprawdzamy czy interesujące nas wyrażenie znajdują się w $_SERVER['HTTP_USER_AGENT']. Możemy to zrobić np. tak:
Najpierw za pomocą komendy strtolower() zamienimy wszystkie litery na małe aby łatwiej nam się wyszukiwało informacji o przeglądarce i systemie. Następnie za pomocą strpos() sprawdzamy czy interesujące nas wyrażenie znajdują się w $_SERVER['HTTP_USER_AGENT']. Możemy to zrobić np. tak:
środa, 19 listopada 2008
[PHP] Jak zablokować powtórne przetwarzanie formularzy przy odświeżaniu strony?
Bardzo częstym problemem na który natrafiają początkujący programiści PHP jest problem ponownego wysłania danych po odświeżaniu strony do której zostały przesłane dane z formularza HTML. Jeżeli nasz skrypt dodaje dane z formularza do bazy danych to po odświeżeniu strony zwyczajnie je doda jeszcze raz. Możemy ten problem bardzo łatwo rozwiązać za pomocą sesji oraz bardzo prostej funkcji PHP:
W powyższej funkcji generujemy 32-znakowy unikalny hash przemnażając czas razy losową liczbę uzyskując w ten sposób unikalny identyfikator, który przypiszemy do naszego wysłanego formularza.
Następnie w formularzu dodajemy następującą ukrytą linię:
Wywołuje ona naszą funkcję wysyłając w zmiennej hash nasz unikalny klucz.
A tak wygląda plik, który odbiera dane z formularza:
Jeżeli zmienna sesyjna adduser nie istnieje lub jest różna od przesłanej zmiennej hash z formularza to skrypt tworzy taką zmienną sesyjną i wykonuje wszystkie czynności jakie powinien zrobić po prawidłowym wysłaniu formularza. Jeżeli natomiast taka zmienna istnieje i jest równa zmienna hash z formularza tzn. że ten formularz był już wysłany.
W powyższej funkcji generujemy 32-znakowy unikalny hash przemnażając czas razy losową liczbę uzyskując w ten sposób unikalny identyfikator, który przypiszemy do naszego wysłanego formularza.
Następnie w formularzu dodajemy następującą ukrytą linię:
Wywołuje ona naszą funkcję wysyłając w zmiennej hash nasz unikalny klucz.
A tak wygląda plik, który odbiera dane z formularza:
Jeżeli zmienna sesyjna adduser nie istnieje lub jest różna od przesłanej zmiennej hash z formularza to skrypt tworzy taką zmienną sesyjną i wykonuje wszystkie czynności jakie powinien zrobić po prawidłowym wysłaniu formularza. Jeżeli natomiast taka zmienna istnieje i jest równa zmienna hash z formularza tzn. że ten formularz był już wysłany.
piątek, 10 października 2008
Wprowadzenie do wyrażeń regularnych w PHP - metaznaki
Jeżeli często używamy linuxa to na pewno wyrażenia regularne nie są nam obce. Również wiele języków webowych ma dobrze rozwiniętą obsługę tych wyrażeń. Dzisiaj przyjrzymy się wykorzystywaniu wyrażeń regularnych (ang. regular expressions, w skrócie regex lub regexp) w PHP.
Wyrażenia regularne są potężną techniką opisywania wzorców tekstu występujących w plikach tekstowych - wiele programów wykorzystuje tą funkcjonalność. Programy do wyszukiwania takie jak 'grep' opierają się właśnie na tych wyrażeniach. Zasadniczo wyrażenia regularne ukształtowały się w świecie linuxa. Powstało wiele języków skryptowych, takich jak perl, ruby, PHP, JS, etc., które bazują na wyrażeniach regularnych. Wyrażenia regularne są również intensywnie wykorzystywane w module mod_rewrite w Apache'u, który opisałem we wcześniejszych postach. Coraz mniej jest języków, które nie posiadają choćby kilku funkcji wykorzystujących wyrażenia regularne, tak więc bardzo istotną sprawą jest opanowanie tego wielofunkcyjnego narzędzia.
Nie przestrasz się zewnętrznym wyglądem ułożonych wyrażeń regularnych; mnóstwo znaków specjalnych sprawia wrażenia trudnego do opanowania, ale jak już poznasz podstaw to uświadomisz sobie, że łatwiej już chyba nie może być. Przykładowo, za pomocą wzorca [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z]{2,4} można sprawdzić poprawność wpisanego w formularz adresu e-mail. Poznając podstawy wyrażeń regularnych powyższy zapis stanie się dla Ciebie jasny jak słońce.
Metaznaki:
Wyrażenia regularne mogą składać się ze zwykłych znaków lub z metaznaków. Zwykłe znaki to np. zapis "RegEx is easy", natomiast metaznaki oprócz tego, że wyglądają jak zwykłe znaki, mają dodatkowo pewne zastosowanie merytoryczne. W wyrażeniach regularnych używając zwykłego znaku np. "P", znajdujemy w tekście "P". Jeżeli użyjemy metaznaku, możemy dopasować o wiele więcej szukanych fragmentów.
Wyróżniamy następujące metaznaki:
. + ? * ^ $ [ ( ) \ | {
Słownie te znaki to: kropka, plus, znak zapytania, asterisk, karetka, dolar, nawias kwadratowy otwierający, nawiasy zwykłe, backslash, kreska pionowa (alternatywa), klamra otwierająca.
Najłatwiej jest zrozumieć działanie metaznaków na przykładzie. Załóżmy, że chcemy w pliku tekstowym odnaleźć wszelkie wpisy o treści *.php to nasze wyrażenie regularne będzie miało postać \*\.php a nie *.php, ponieważ * i . to metaznaki i aby były traktowane jako normalny znak musimy użyć backslasha. Z angielskiego nazywa się to escape character, jednak trzeba pamiętać aby używać go tylko przed mataznakami, czyli przed '(', ')', '[', ']', '{', '}', '\', '*', '|', '^', '$', '?' przed zwykłymi znakami powoduje coś zupełnie innego, a mianowicie predefiniowane klasy znakowe. Ale o tym w kolejnym poście.
Wyrażenia regularne są potężną techniką opisywania wzorców tekstu występujących w plikach tekstowych - wiele programów wykorzystuje tą funkcjonalność. Programy do wyszukiwania takie jak 'grep' opierają się właśnie na tych wyrażeniach. Zasadniczo wyrażenia regularne ukształtowały się w świecie linuxa. Powstało wiele języków skryptowych, takich jak perl, ruby, PHP, JS, etc., które bazują na wyrażeniach regularnych. Wyrażenia regularne są również intensywnie wykorzystywane w module mod_rewrite w Apache'u, który opisałem we wcześniejszych postach. Coraz mniej jest języków, które nie posiadają choćby kilku funkcji wykorzystujących wyrażenia regularne, tak więc bardzo istotną sprawą jest opanowanie tego wielofunkcyjnego narzędzia.
Nie przestrasz się zewnętrznym wyglądem ułożonych wyrażeń regularnych; mnóstwo znaków specjalnych sprawia wrażenia trudnego do opanowania, ale jak już poznasz podstaw to uświadomisz sobie, że łatwiej już chyba nie może być. Przykładowo, za pomocą wzorca [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z]{2,4} można sprawdzić poprawność wpisanego w formularz adresu e-mail. Poznając podstawy wyrażeń regularnych powyższy zapis stanie się dla Ciebie jasny jak słońce.
Metaznaki:
Wyrażenia regularne mogą składać się ze zwykłych znaków lub z metaznaków. Zwykłe znaki to np. zapis "RegEx is easy", natomiast metaznaki oprócz tego, że wyglądają jak zwykłe znaki, mają dodatkowo pewne zastosowanie merytoryczne. W wyrażeniach regularnych używając zwykłego znaku np. "P", znajdujemy w tekście "P". Jeżeli użyjemy metaznaku, możemy dopasować o wiele więcej szukanych fragmentów.
Wyróżniamy następujące metaznaki:
. + ? * ^ $ [ ( ) \ | {
Słownie te znaki to: kropka, plus, znak zapytania, asterisk, karetka, dolar, nawias kwadratowy otwierający, nawiasy zwykłe, backslash, kreska pionowa (alternatywa), klamra otwierająca.
. - kropka pasuje do dowolnego znaku, a więc wyrażenie r.d pasuje do wyrażeń rod, rad, rid, r$d, r6d, itd.
+ - plus to jedno lub więcej wystąpień wyrażenia poprzedzającego, np. Do+M pasuje do DoM, DooM, DoooM, DooooM, itd.
? - znak zapytania oznacza zero lub jedno wystąpienie poprzedzajacego wyrażenia, a więc np. Do?M pasuje do DM lub DoM.
* - asteriks to zero lub więcej wystąpień wyrażenia poprzedzającego, np. Do*M pasuje do DM, DoM, DooM, DoooM, DooooM, itd.
^ - karetka użyta na początku wyrażenia (przed nawiasami) odpowiada za początek linii, natomiast użyta po nawiasie kwadratowym oznacza zaprzeczenie, np. [^0-9] oznacza wszystkie znaki z wyjątkiem liczb od 0 do 9.
$ - dolar oznacza koniec danego napisu lub po prostu koniec linii
[ ] - nawiasy kwadratowe służą do dopasowywania liter z podanego zbioru, np. [dgj] pasuje do jednej z liter, d, g lub j. [a-z] oznacza wszystkie małe litery od a do z, jednak taki zakres nie obejmuje polskich znaków. Aby określić wszystkie znaki polskiego alfabetu musimy użyć wyrażenia [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]
( ) - tzw. atom - umożliwia zastosowanie alternatywy | (or) oraz na dopasowywanie powtarzających się fragmentów ciągów znaków. Przykładowo, do wyrażenia /^(abc)+$/ pasują ciągi "abc", "abcabc", "abcabcabc" itd.
\ - backslash pozwala nam na używanie specjalnych znaków we wzorcu, tak aby były również wyszukiwane a nie traktowane jako metaznak. Tzn. aby znaleźć plik.txt musimy użyć zapisu plik\.txt. Wyrażenie plik.txt potraktowałoby nam kropkę jako metaznak i znalazłoby również wyrażenia takie jak plikitxt, plik1txt, etc.
| - pionowa kreska (ang. pipeline)oznacza alternatywę. Inaczej mówiąc jest to operator logiczny 'OR'. Jeżeli np. napiszemy a|b|c oznacza to, że w danym wyrażeniu może wystąpić a lub b lub c.
+ - plus to jedno lub więcej wystąpień wyrażenia poprzedzającego, np. Do+M pasuje do DoM, DooM, DoooM, DooooM, itd.
? - znak zapytania oznacza zero lub jedno wystąpienie poprzedzajacego wyrażenia, a więc np. Do?M pasuje do DM lub DoM.
* - asteriks to zero lub więcej wystąpień wyrażenia poprzedzającego, np. Do*M pasuje do DM, DoM, DooM, DoooM, DooooM, itd.
^ - karetka użyta na początku wyrażenia (przed nawiasami) odpowiada za początek linii, natomiast użyta po nawiasie kwadratowym oznacza zaprzeczenie, np. [^0-9] oznacza wszystkie znaki z wyjątkiem liczb od 0 do 9.
$ - dolar oznacza koniec danego napisu lub po prostu koniec linii
[ ] - nawiasy kwadratowe służą do dopasowywania liter z podanego zbioru, np. [dgj] pasuje do jednej z liter, d, g lub j. [a-z] oznacza wszystkie małe litery od a do z, jednak taki zakres nie obejmuje polskich znaków. Aby określić wszystkie znaki polskiego alfabetu musimy użyć wyrażenia [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]
( ) - tzw. atom - umożliwia zastosowanie alternatywy | (or) oraz na dopasowywanie powtarzających się fragmentów ciągów znaków. Przykładowo, do wyrażenia /^(abc)+$/ pasują ciągi "abc", "abcabc", "abcabcabc" itd.
\ - backslash pozwala nam na używanie specjalnych znaków we wzorcu, tak aby były również wyszukiwane a nie traktowane jako metaznak. Tzn. aby znaleźć plik.txt musimy użyć zapisu plik\.txt. Wyrażenie plik.txt potraktowałoby nam kropkę jako metaznak i znalazłoby również wyrażenia takie jak plikitxt, plik1txt, etc.
| - pionowa kreska (ang. pipeline)oznacza alternatywę. Inaczej mówiąc jest to operator logiczny 'OR'. Jeżeli np. napiszemy a|b|c oznacza to, że w danym wyrażeniu może wystąpić a lub b lub c.
Najłatwiej jest zrozumieć działanie metaznaków na przykładzie. Załóżmy, że chcemy w pliku tekstowym odnaleźć wszelkie wpisy o treści *.php to nasze wyrażenie regularne będzie miało postać \*\.php a nie *.php, ponieważ * i . to metaznaki i aby były traktowane jako normalny znak musimy użyć backslasha. Z angielskiego nazywa się to escape character, jednak trzeba pamiętać aby używać go tylko przed mataznakami, czyli przed '(', ')', '[', ']', '{', '}', '\', '*', '|', '^', '$', '?' przed zwykłymi znakami powoduje coś zupełnie innego, a mianowicie predefiniowane klasy znakowe. Ale o tym w kolejnym poście.
poniedziałek, 4 sierpnia 2008
Budujemy panel w PHP do zarządzania adresami sieci w Linux w oparciu o edycję pliku /etc/network/interfaces
Dzisiaj zajmiemy się budową panelu w PHP, który poprzez proste wpisywanie adresów w pola tekstowe będzie nam edytował plik /etc/network/interfaces po czym zrestartuje automatycznie sieć. Jest to bardzo przydatne jeżeli ktoś zarządza serwerem bądź ruterem na linuxie i zamiast łączyć się przez SSH po prostu loguje się na stronę jako admin lub ktokolwiek i tam swobodnie i bez przeszkód wpisuje swoje ustawienia sieci. Całość tłumacze w oparciu o Debiana.
Zaczynając pisać kod w PHP, który wykonuje pewne polecenia przez przez konsole należy zaznajomić się z prawami dostępu w linuxie. Jak wiadomo domyślnie wszelkie skrypty linuxa, które służą do edycji systemowych ustawień należą do właściciela i grupy root. Niestety (albo stety) nie możemy (nie chcemy) uruchomić serwera apachea jako root ponieważ jest to wysoce ryzykowne dla naszego serwera. W standardzie apache uruchamia wszelkie skrypty jako użytkownik www-data lub po prostu 33. Dlatego właśnie musimy zmienić właściciela oraz grupę wszystkich plików które będą przez nas używane na www-data.
Oto lista plików, których właścicieli musimy zmienić poleceniami:
1. /etc/network/interfaces
2. /etc/init.d/networking
3. /etc/network/run/ifstate
Ok, jeżeli mamy już zmienione uprawnienia możemy zabrać się za nasz panel, ale najpierw rzućmy okiem na nasz plik /etc/network/interfaces. U mnie wygląda on tak:
Tutaj każdy będzie musiał się wykazać inicjatywą i zbudować własny kod PHP pod swój plik interfaces.
Aby zbudować panel będziemy musieli utworzyć dla pliki PHP: panel.php i panel_edit.php.
Tak mniej więcej będzie wyglądał plik panel.php:
A tak będzie wyglądał nasz plik panel_edit.php:
Wszelkie szczegóły starałem się umieścić w kodzie w komentarzach. Kod nie jest skomplikowany, więc myślę że każdy sobie poradzi z jego zrozumieniem. W razie problemów proszę pisać w komentarzach - postaram się rozwiać wszelkie wątpliwości.
Zaczynając pisać kod w PHP, który wykonuje pewne polecenia przez przez konsole należy zaznajomić się z prawami dostępu w linuxie. Jak wiadomo domyślnie wszelkie skrypty linuxa, które służą do edycji systemowych ustawień należą do właściciela i grupy root. Niestety (albo stety) nie możemy (nie chcemy) uruchomić serwera apachea jako root ponieważ jest to wysoce ryzykowne dla naszego serwera. W standardzie apache uruchamia wszelkie skrypty jako użytkownik www-data lub po prostu 33. Dlatego właśnie musimy zmienić właściciela oraz grupę wszystkich plików które będą przez nas używane na www-data.
Oto lista plików, których właścicieli musimy zmienić poleceniami:
chown www-data [plik] oraz chgrp www-data [plik]:1. /etc/network/interfaces
2. /etc/init.d/networking
3. /etc/network/run/ifstate
Ok, jeżeli mamy już zmienione uprawnienia możemy zabrać się za nasz panel, ale najpierw rzućmy okiem na nasz plik /etc/network/interfaces. U mnie wygląda on tak:
auto lo
iface lo inet loopback
up ip l s imq0 up && ip l s imq1 up
auto eth0
iface eth0 inet static
address 212.244.101.111
netmask 255.255.255.53
network 10.5.1.0
broadcast 10.5.1.10
gateway 10.5.1.1
up echo 1 > /proc/sys/net/ipv4/conf/all/proxy_arp
auto eth1
iface eth1 inet static
address 212.244.101.129
netmask 255.255.255.128
network 212.244.101.128
broadcast 212.244.101.255
up route add -host 212.244.101.244 dev eth1
auto eth1:1
iface eth1:1 inet static
address 10.10.1.1
netmask 255.255.0.0
network 10.10.1.1
broadcast 10.10.1.255
auto eth1:0
iface eth1:0 inet static
address 172.16.171.1
netmask 255.255.255.0
network 172.16.171.0
broadcast 172.16.171.255
iface lo inet loopback
up ip l s imq0 up && ip l s imq1 up
auto eth0
iface eth0 inet static
address 212.244.101.111
netmask 255.255.255.53
network 10.5.1.0
broadcast 10.5.1.10
gateway 10.5.1.1
up echo 1 > /proc/sys/net/ipv4/conf/all/proxy_arp
auto eth1
iface eth1 inet static
address 212.244.101.129
netmask 255.255.255.128
network 212.244.101.128
broadcast 212.244.101.255
up route add -host 212.244.101.244 dev eth1
auto eth1:1
iface eth1:1 inet static
address 10.10.1.1
netmask 255.255.0.0
network 10.10.1.1
broadcast 10.10.1.255
auto eth1:0
iface eth1:0 inet static
address 172.16.171.1
netmask 255.255.255.0
network 172.16.171.0
broadcast 172.16.171.255
Tutaj każdy będzie musiał się wykazać inicjatywą i zbudować własny kod PHP pod swój plik interfaces.
Aby zbudować panel będziemy musieli utworzyć dla pliki PHP: panel.php i panel_edit.php.
Tak mniej więcej będzie wyglądał plik panel.php:
A tak będzie wyglądał nasz plik panel_edit.php:
Wszelkie szczegóły starałem się umieścić w kodzie w komentarzach. Kod nie jest skomplikowany, więc myślę że każdy sobie poradzi z jego zrozumieniem. W razie problemów proszę pisać w komentarzach - postaram się rozwiać wszelkie wątpliwości.
Subskrybuj:
Posty (Atom)
