Pokazywanie postów oznaczonych etykietą PHP. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą PHP. Pokaż wszystkie posty

środa, 18 stycznia 2017

[PHP][OOP] Abstrakcja, interfejsy i wzorzec Factory

TRUE
4704597062652094618
Aktualizacja: 20.01.2017 15:00. Większość początkujących w programowaniu obiektowym programistów ma problemy ze zrozumieniem w jaki sposób prawidłowo wykorzystywać mechanizmy takie jak dziedziczenie, abstrakcje i interfejsy. Różne tutoriale, czy poradniki dostępne w sieci nie ułatwiają tego, gdyż zwykle opisują one jedynie zasadę działania tych mechanizmów, bez pokazania praktycznego tego zastosowania - do takiej wiedzy trzeba już sięgnąć do książek, ale i te nierzadko traktują sprawę po macoszemu. O ile koncepcja tego wszystkiego jest prosta, to dużo ludzi ma na początku problemy z wyczuciem tego w jaki sposób prawidłowo wykorzystywać to w praktyce. Początkujący programiści jedynie wiedzą, że takie coś jest, ale nie bardzo są w stanie zrozumieć, do czego to wszystko tak naprawdę może posłużyć. W tym artykule przeanalizujemy sobie więc do czego tak naprawdę użyć tych wszystkich mechanizmów i sprawimy, że słowo abstrakcja nie będzie się już kojarzyć nikomu z żadną czarną magią, tudzież z czymś trudnym do zrozumienia. Dzisiaj zaprzyjaźnimy się z ową abstrakcją..

Czym tak naprawdę jest abstrakcja?

Na pewno wiecie, czym są klasy abstrakcyjne, a przynajmniej jak takie klasy definiujemy. Jak wiadomo klasy abstrakcyjne definiujemy za pomocą abstract class, następnie podajemy w definicji klasy metody abstrakcyjne, które będą musiały zostać pokryte we wszystkich (tym razem już nie-abstrakcyjnych) klasach dziedziczących po naszej nadrzędnej abstrakcyjnej klasie. Czym więc tutaj jest ta magiczna abstrakcja? Otóż wymusza ona niejako na wszystkich klasach potomnych utworzenie dokładnie takich metod, jakie w klasie bazowej (tej abstrakcyjnej) zostały określone. Klasa abstrakcyjna sama w sobie nie posiada definicji tychże metod, posiada jedynie ich deklaracje. Możemy więc powiedzieć, że do momentu utworzenia tych metod w klasach potomnych (dziedziczących) wszystkie te metody tak naprawdę nie istnieją, istnieją jedynie abstrakcyjnie. Niby są, a jednak jeszcze ich nie ma, gdyż istnieje dopiero póki co ich deklaracja, że takowe prawdopodobnie się gdzieś dalej w kodzie pojawią. Tym właśnie jest abstrakcja.

Przyjrzyjmy się najprostrzej klasie abstrakcyjnej:
[code]
<?php
abstract class AbstractHuman {

  // kod
}
[/code]

wtorek, 11 sierpnia 2015

[PHP][Bezpieczeństwo] Posolić, czy spieprzyć?

TRUE
1971613062479556600
Hasła można dobrze posolić, albo totalnie sprawę spieprzyć. Prawidłowe posolenie hasła może być dla mało doświadczonej osoby dość niejasne. A czym jest w ogóle to posolenie? Otóż jest to dodanie do hasła jakiegoś ciągu znaków (soli), a następnie dopiero zahaszowanie takiego połączonego ciągu i dopiero zapisanie go w bazie. Co to daje? Otóż daje to to, że nawet po wycieku hashy z bazy nie da się z nimi zbytnio nic zrobić, o ile zostały dobrze posolone i potraktowane dobrym, silnym algorytmem. A dlaczego? Ano dlatego, że nie da rady ich porównać z tablicami, które zawierają listę hashy odpowiadającą wartościom niezahashowanym, tzw. tablicami tęczowymi. Nie znaczy to oczywiście, że nie da się takiego hasła złamać, dobre posolenie tworzy jednak jeden kolejny problem do pokonania, a więc zmniejsza prawdopodobnieństwo dla złamania hasła.

wtorek, 21 lipca 2015

[PHP][Bezpieczeństwo] Absolutne podstawy bezpieczeństwa w PHP cz.1

TRUE
3966379113538333976
PHP niesłusznie jest nazywany mało bezpiecznym językiem. Przeświadczenie takie pozostało po poprzednich wersjach języka, które szczerze mówiąc rzeczywiście pozostawiały wiele do życzenia w kwestiach bezpieczeństwa, szczególnie w rękach mało doświadczonych programistów. To się jednak zmieniło, a PHP wciąż ewoluuje. Prawda jest taka, że poprawnie skonfigurowany serwer, z poprawnie skonfigurowanym PHP i prawidłowo skonfigurowaną bazą danych, na których działa poprawnie napisana aplikacja to mieszanka, która może się okazać naprawdę bardzo bezpieczna.
Trzeba jedynie trzymać się pewnych reguł i zasad, mieć pojęcie o możliwych typach ataków i pisać kod "z głową". W cyklu artykułów tutaj postaramy się omówić sobie wszystkie najważniejsze zasady, których bezwzględnie powinniśmy się trzymać podczas pisania swoich aplikacji w PHP. Na spokojnie, w cyklu kilku artykułów omówimy sobie także zabezpieczenia po stronie serwera, silnika, bazy i zasady bezpiecznej ich konfiguracji.
Idąc na przekór wielu poradnikom, które opisuję jedynie techniczne aspekty dodam od siebie kilka spraw, które nie są zazwyczaj opisywane w poradnikach. Zaczynamy część pierwszą, która zarazem będzie jedynie wstępem i krótkim wprowadzeniem do cyklu artykułów.

Zasada numer zero, czyli po co "hackerom" moje dane.

Postanowiłem jako pierwsze (a właściwie zerowe) opisać pewne błędne założenie, które ja nazywam następująco: "Prowadzę stronę o chomikach, więc po co crackerom moja baza danych?".
Jest to bardzo często spotykane myślenie wśród osób zarządzających swoimi serwerami i oprogramowaniem. Jest to myślenie jak najbardziej niepoprawne. Należy bowiem pamiętać, że każda zdobyta informacja - nawet taka jak dostęp do bazy danych strony o chomikach jest na wagę złota.

Po pierwsze - daje to crackerowi wolny dostęp do danych na serwerze, po drugie - co łączy się z pierwszym - na serwerze tym może też wkrótce (lub już istnieje) pojawić się inny serwis, do którego z automatu będzie miało się dostęp. Po trzecie - może to też być hosting dzielony, co stworzy crackerowi jeszcze większe pola do popisu. Po czwarte - w bazie danych mogą znaleźć się i najprawdopodobniej się znajdują dane kluczowe dla użytkowników, jak ich loginy, hashe haseł (lub nawet czasami same hasła otwartym tekstem co woła o pomstę do nieba), ich emiale i inne dane osobowe. Dane takie są cenne, gdyż istnieje prawdopodobieństwo, że dany użytkownik używa podobnych danych do logowania np. na swoją skrzynkę pocztową. Stąd już krótka droga do kilku socjotechnicznych zabiegów i np. przejęcia konta w banku. Brzmi jak bajka? To nie jest bajka, lecz rzeczywistość i taki z pozoru nic cennego nie posiadający serwis o hodowaniu chomików może wywołać nieświadomie tzw. efekt motyla, przez który ucierpieć mogą nieświadomi użytkownicy.




Biorąc więc pod uwagę powyższe (a opisałem tylko kilka aspektów) powinniśmy zawsze pamiętać, że nawet z pozoru nic nieznacząca aplikacja webowa może w rzeczywistości wywołać prawdziną lawinę, za którą odpowiedzialni będziemy właśnie my. W związku z tym - każda, nawet najmniejsza aplikacja działająca w sieci powinna być dokładnie przeanalizowana i przede wszystkim stworzona z uwzględnieniem wszystkich niezbędnych wymogów bezpieczeństwa. Wiadomo, że nikt nie jest wróżbitą, a żadna aplikacja nie jest idealna i w 100% bezpieczna, ale trzymając się kluczowych zasad możemy przynajmniej sprawić, że nie będzie ona dla crackera jak otwarta książka.

Złota zasada - każdego użytkownika traktujemy jako potencjalnego atakującego.
Bez wyjątków.

środa, 17 czerwca 2015

[PHP][RegEx] Podstawy wyrażeń regularnych cz.1

TRUE
1888640682065359108
Wyrażenia regularne (regular expressions) to obszerny temat, ale raz zrozumiany przydaje się ogromnie w każdym projekcie i w każdym języku programowania. W skrócie jest to wzorzec, który dopasowujemy do zadanego ciągu znaków. Od zwykłego porównywania dwóch ciągów tekstowych różni się tym, że w przypadku wyrażenia regularnego podajemy wzorzec (pattern), a nie drugi ciąg. Wzorzec taki następnie może być dopasowany do więcej niż jednego ciągu tekstowego. Za pomocą wyrażenia regularnego dopasowywać możemy litery, cyfry, znaki interpunkcyjne i specjalne, w tym te "niewidzialne", jak tabulacja, czy znak nowej linii. Mają zastosowanie wszędzie tam, gdzie występuje konieczność sprawdzenia, czy dany ciąg znaków pasuje do zadanego wzorca, np. czy jest on poprawnym adresem emial, bądź adresem URL. Stosowane są praktycznie na każdym kroku. W sieci jest cała masa testerów on-line, jeśli chodzi o poprawność wyrażeń. Polecam do zabawy, kilka z nich znajdziemy tutaj, w dziale QuickLinks.

1. Ograniczniki - /

Każde wyrażenie regularne powinno zostać objęte w ogranicznik na początku i końcu wyrażenia. Takim ogranicznikiem zazwyczaj jest slash ( / ), ale może to być również inny znak. Przyjęło się jednak, że jako ogranicznik stosujemy / i tego się trzymajmy. Proste wyrażenie regularne może mieć więc następującą postać:
[code]/kot/[/code]
gdzie kot to wzorzec dopasowania, a / na początku i końcu to ograniczniki. Wyrażenie takie pasować będzie do każdego ciągu tekstowego, w którym występować będzie słowo kot.
Pasować będzie do wszystkich trzech poniższych ciągów:
[code]Ala ma kota.[/code]
[code]Ala ma kota i Ola ma kota.[/code]
[code]kot ma na imię Mruczek[/code]
[code]Te koty mają po 4 lata.[/code]
Nie ma znaczenia, czy ciąg kot występuje tutaj na początku, na końcu, czy w środku badanego ciągu tekstowego oraz ile razy wystąpi, ma jednak znaczenie wielkość liter. Powyższe wyrażenie nie dopasuje się już więc do ciągu:
[code]Kot jest szary.[/code]
W powyższym zdaniu Kot != kot.
Zachowanie funkcji dopasowującej możemy zmienić za pomocą dodatkowych parametrów, tak aby ignorowała wielkość liter i dopasowała słowo kot zarówno do kot, Kot, jak i KoT, ale o tym w kolejnej części.

środa, 10 czerwca 2015

[PHP] Poprawna dokumentacja kodu i phpDocumentator

TRUE
3050546257291765393
phpDocumentator to pakiet służący do generowania dokumentacji API dla kodu PHP. Jest to powszechnie używany pakiet i jest on stosowany w wielu popularnych projektach, jak Zend, czy Propel Korzysta z niego większość programistów PHP na świecie, a dokumentowanie kodu za pomocą bloków DocBlock to już praktycznie standard. Warto więc zapoznać się z pakietem i dokumentować swój kod według ściśle określonych wytycznych. Pozwoli to nie tylko na bezproblemowe przygotowanie pełnej dokumentacji w formie przystępnej dla odbiorcy, ale przede wszystkim pomoże innym programistom, którzy pracować będą z naszym kodem.

Prawda jest taka, że kod bez dokumentacji to zazwyczaj katorga dla osoby z nim pracującej. W mniejszych projektach może nie stanowi to większego problemu, ale w przypadku, gdy mamy do czynienia z dużymi projektami składającymi się z dużej ilości rozbudowanych klas brak dobrej dokumentacji jest wręcz dla takiego kodu dyskwalifikacją. Dobra dokumentacja powinna składać się z kilku elementów - po pierwsze: musi ona być. Po drugie - musi ona trzymać się pewnych standardów, takich jak sposób opisu danej klasy, jej metod, czy własności. Z koleji przy dokumentacji metod i funkcji w dokumentacji powinień znaleźć się opis pobieranych i zwracanych parametrów, a także opis ich typów. Wszelkie tego typu kluczowe informacje powinny się w dokumentacji znaleźć i powinny zostać podane w pewien ustandaryzowany sposób.

Pakiet phpDocumentator wymusza na programiście pewien schemat dokumentowania kodu i radzę się tego schematu trzymać w każdym swoim projekcie, nawet jeśli nie mamy zamiaru przygotowywać do niego zewnętrznej dokumentacji za pomocą narzędzi takich jak phpDocumentator. Składnia taka po prostu jest powszechna wśród programistow i co za tym idzie - zostanie szybko zrozumiana przez innego programistę pracującego z naszym kodem. W artykule tym na początku omówimy sobie wszystkie aspekty tego jak poprawnie powinna taka dokumentacja wyglądać, a na sam koniec zobaczymy co z tak przygotowanej dokumentacji potrafi wygenerować nam phpDocumentator.
Strona oficjalna phpDocumentatora to: http://phpdoc.org/.

środa, 3 czerwca 2015

[PHP][Propel] Instalacja oraz wstęp do Propel ORM

TRUE
3045453951852043091
Propel do biblioteka służąca do mapowania obiektowo-relacyjnego, w skrócie ORM. Podobnie jak biblioteka Doctrine sprawia on, że praca na bazie danych odbywa się za pomocą zwykłych obiektów. Jest odrobinę łatwiejszy w użyciu, niż Doctrine, co jednak nie znaczy, że jest gorszy. Praca z obiema bibliotekami jest w zasadzie podobna, opiera się ona na przygotowaniu schematu bazy danych, wygenerowaniu odpowiednich metod dla modelu, a następnie na pracy na modelu jak na zwykłych obiektach. Propela, podobnie jak Doctrine możemy w prosty sposób połączyć z popularnymi frameworkami, jak Zend, czy Symfony - integracja taka zostanie tutaj opisana w którymś z artykułów.

W poniższym natomiast artykule pobierzemy i zainstalujemy sobie bibliotekę Propela, skonfigurujemy ją, uruchomimy, a następnie przygotujemy prosty, testowy model bazy i zobaczymy jak to mniej więcej działa. Artykuł przedstawia procedurę w systemach Windows, na Linuxach jednak wszystko (poza oczywiście innymi ścieżkami) wygląda podobnie.

wtorek, 2 czerwca 2015

[PHP][Zend2] Instalacja i podstawy frameworka Zend2

TRUE
1487821199145981101
Zend to jeden z najpopularniejszych i najprzyjemniejszych w użyciu frameworków do PHP. Jest bardzo rozbudowanym środowiskiem, a mimo tego jego nauka nie stwarza większych problemów (jak to czasem może mieć miejsce w przypadku Symfony). Posiada bardzo obszerną dokumentację oraz niesamowicie rozbudowaną społeczność swoich użytkowników, jest więc prawie pewne, że napotykając na dany problem zawsze znajdziemy jakieś rozwiązanie, czy wskazówkę.

Za pomocą Zenda stworzyć można praktycznie każdą aplikację webową, zawiera on w sobie bardzo domyślnych komponentów, zaczynając od absolutnie podstawowych, na bardziej wyspecjalizowanych skończywszy. Obecnie rozwijana jest wersja 2 frameworka, a za niedługo światło dzienne ujrzy wersja trzecia. Tutaj zajmiemy się właśnie tą drugą wersją i w cyklu artykułów nauczymy się krok po kroku pisania aplikacji za pomocą frameworka Zend.

Na samym początku, podobnie jak w większości artykułów tutaj - cykl tutoriali zaczynamy od opisu instalacji, wstępu i podstawowej konfiguracji środowiska. Zaczynamy więc.

[PHP][Symfony2] Instalacja i pierwsze uruchomienie Symfony2 krok po kroku

TRUE
821936260844612134
Framework Symfony to jeden z najpotężniejszych frameworków napisanych dla PHP. Jest to też zarazem jeden z najpopularniejszych frameworków na świecie, warto byłoby zatem znać choćby jego podstawy. Nie jest to jednak framework łatwy w nauce, a na początku jego ogrom może nieco przytłaczać. Wszystko jednak można opanować i w cyklu artykułów tutaj postaramy się nauczyć pracy z Symfony krok po kroku. Będziemy używać wersji z gałęzi 2.x.x, gdyż wprowadza ona niesamowicie dużą ilość ilość zmian w stosunku do swoich starszych wersji, tj. wersji Legacy z gałęzi 1.x.x.

Zasadniczą różnicą powiędzy wersjami 1 i 2 jest wprowadzenie zupełnie innej architektury w tej drugiej, opartej na mechaniźmie tzw. komponentów, o których oczywiście nauczymy się tutaj. Zacznijmy zatem pracę z Symfony2 i na początek pobiermy, zainstalujmy, uruchomijmy i skonfigurujmy swoje pierwsze środowisko oparte na Symfony2. Opiszę procedurę dla systemów z rodziny Windows, zakładając, że mamy zainstalowany i działający serwer Apache. Pierwsze uruchomienie Symfony dla osób nieznających tego frameworka jest nieco problematyczne, więc opiszę wszystko dokładnie krok po kroku.

Przygodę rozpoczynamy od oficjalnej strony frameworka, która znajduje się pod adresem: http://www.symfony.com. Znajdziemy tutaj informacje o najnowszej wersji, przejrzymy bazę komponentów i uzyskamy dostęp do całej dokumentacji, a ta jest naprawdę obszerna. Istnieje również polska wersja dokumentacji, dostępna pod adresem: http://symfony-docs.pl/.

poniedziałek, 1 czerwca 2015

[PHP][Doctrine2] Instalacja i wstęp do Doctrine2 ORM

TRUE
1915472901869042583
Doctrine jest systemem ORM dla relacyjnych baz danych, napisanym w PHP. ORM (Object-relational Mapping), czyli po polsku Mapowanie Obiektowo-relacyjne jest to ogólnie rzecz biorąc technika zamiany danych opisanych za pomocą obiektów w ich relacyjne modele w bazie danych. W systemach ORM pracujemy nie na rekordach z bazy, lecz na obiektach, gdyż każdy rekord reprezentowany jest jako pełnoprawny obiekt. Doctrine jest właśnie jednym z najpopularniejszych rozwiązań, które oferują takie mapowanie dla PHP.

Korzystając z bibliotek Doctrine każda tabela w bazie danych prezentowana jest jako jedna wielka klasa, gdzie poszczególne rekordy (wiersze) są jej obiektami. Na obiektach takich pracujemy dokładnie tak samo jak na zwykłych obiektach, utworzonych w tradycyjny sposób. W artykule tym zainstalujemy sobie Doctrine na własnym serwerze i nauczymy się podstaw pracy z nim.

niedziela, 31 maja 2015

[PHP][Smarty] Instalacja i wstęp do Smarty

TRUE
4301483683097307750
Smarty to chyba najpopularniejszy system szablonów jaki istnieje do PHP. Rozwijany przez lata doczekał się już jakiś czas temu swojej 3 wersji. Smarty pozwala na całkowite rozdzielenie warstwy prezentacyjnej aplikacji od jej warstwy logiki. Rozbudowywany przez lata dorobił się naprawdę ogromu funkcji możliwości. W artykule tym zobaczymy w jaki sposób zainstalować silnik Smarty w swojej aplikacji oraz jak w podstawowy sposób z niego korzystać. Taka podstawowa wiedza pozwoli na zapoznanie się z systemem i umożliwi dalszą naukę tego co Smarty oferuje, a oferuje naprawdę bardzo wiele.

Dzięki Smarty całkowicie oddzielimy warstwę prezentacji naszej aplikacji i zgodnie ze wzorcem MVC w pełni odseparujemy ją od reszty aplikacji. Na początek może krótkie wprowadzenie do tego czym jest i jak powinien być rozumiany wzorzec MVC. Nazwa tego wzorca to skrót od Model-View-Controller, a więc Model-Prezentacja-Kontroler.

Jest to ogólnie przyjęty wzorzec projektowania aplikacji, który rozdziela ją na 3 niezależne, ale współpracujące ze sobą warstwy. Warstwa modelu odpowiada za wszystkie dane jakie przetwarza aplikacja, zarządza dostępem do bazy i zajmuje się przetwarzaniem wszystkich elementów z którymi pracuje aplikacja. Warstwa prezentacyjna odpowiada za wyświetlanie przetwarzanych przez warstwę modelu danych użytkownikowi i za interfejs komunikacji z nim. Warstwa kontrolera natomiast steruje tym wszystkim i zarządza aplikacją określając sposób w jaki przetwarzane w modelu dane przekazać użytkownikowi w warstwie prezentacji. Jest to wzorzec bardzo praktyczny, efektywny i traktowany już obecnie jako standard w projektowaniu aplikacji. Smarty pracować bedzie w drugiej z omówionych warstw - a więc prezentacyjnej.

[PHP][Composer] Instalacja i podstawy używania Composera

TRUE
1325544631049773391
Composer to popularna aplikacja do obsługi zależności pomiędzy bibliotekami w zadanych projektach. Na czym to polega? Otóż pracując nad swoim projektem bardzo często wykorzystujemy jakieś biblioteki i komponenty osób trzecich. Przykładowo - pisząc aplikację korzystającą z ORM Doctrine do obsługi bazy nasza aplikacja jest zależna od tej właśnie biblioteki i wymaga jej do poprawnej pracy. Bibliotekę oczywiście możemy na stałe dołaczyć do naszego projektu, ale jest to rozwiązanie nieeleganckie.

Z pomocą przychodzi właśnie Composer - wystarczy, że spreparujemy odpowiedni plik z informacją dla Composera, w której opiszemy od jakich zewnętrznych bibliotek zależny jest nasz projekt i jakich wymaga do poprawnego działania. Composer następnie podczas instalacji naszej aplikacji odczyta nasz plik z opisem zależności, pobierze je i umieści w naszym projekcie. Takie zewnetrzne biblioteki zazwyczaj lądują w katalogu /vendor.

Co najlepsze - Composer pobierze także zależności dla bibliotek, od jakich zależna jest nasza aplikacja - bo trzeba zauważyć, że może się zdarzyć, że korzystamy z zewnętrznej biblioteki, która do swojego działania wymaga jeszcze innej zewnętrznej biblioteki. Composer wszystko to  automatycznie uwzgledni.

Z Composera korzysta wiele dużych projektów, np. instalując framework Symfony instalujemy go właśnie za pomocą Composera. Jego instalacja w systemie jest prosta i sprowadza się do kilku kroków. Opiszę poniżej sposób instalacji w systemach z rodziny Windows. W Windowsie możemy to zrobić na dwa sposoby - pobierając instalator, który zrobi wszystko za nas, lub manualnie - za pomocą terminala. Opiszę drugi sposób, żeby pokazać jak Composer wygląda "od środka".
Jeśli jednak chcemy to zrobić to automatycznie, to podaję link do instalatora: https://getcomposer.org/Composer-Setup.exe

Oficjalna strona Composera to: https://getcomposer.org/

[PHP] Kiedy cudzysłów, a kiedy apostrof

TRUE
3673455057687492124
...czyli różnica pomiędzy cudzysłowem, a apostrofem.

W PHP, jak i we właściwie każdym języku wszelkie zmienne typu string obejmować musimy w cudzysłowy, lub apostrofy. Mamy tutaj dowolność, jeśli chodzi o wybór - obie formy są poprawne, byleby znak otwierający zgadzał się ze znakiem kończącym. Na pierwszy rzut oka używanie cudzysłowów albo apostrofów nie różni się od siebie działaniem. Różnica jednak jest, o czym wiele osób - szczególnie początkujących nie ma pojęcia. Różnica jest w sposobie interpretacji zawartości objętej cudzysłowem/apostrofem jak i co za tym idzie - w szybkości przetwarzania kodu przez interpreter.

Pisząc kod zawsze powinniśmy starać się o to, aby był on jak najprostszy i jak najszybciej kompilowany przez interpreter. Te malutkie z pozoru różnice w czasie wykonywania kodu urastają do trochę większych, gdy serwer musi obsłużyć takich wykonań tysiące i ma ku temu ograniczone zasoby. Trzeba o tym pamiętać. Wróćmy zatem do tematu o jakim jest ten tekst.

Popatrzmy na przykład poniżej. Z pozoru obie linijki kodu nie różnią się niczym i wykonają się tak samo, ale jak to mówią - pozory mylą.
[code]
<?php
$zmienna1 = "jakiś tekst";
$zmienna2 = 'jakiś tekst';
?>[/code]
Dla człowieka niby tak samo, a jednak dla interpretera PHP zupełnie inaczej. Na czym więc polega różnica w obu zapisach (poza faktem wizualnym oczywiście)? Otóż polega ona na tym w jaki sposób PHP traktuje taki ciąg znaków. Aby bardziej zobrazować sobie to na przykładzie, popatrzmy na poniższe:
[code]
<?php
$kolor = 'czerwony';
$str1 = "Mój ulubiony kolor to: $kolor";
$str2 = 'Mój ulubiony kolor to: $kolor';
echo $str1 . '<br />';
echo $str2;

/*
Wynik:
Mój ulubiony kolor to: czerwony
Mój ulubiony kolor to: $kolor
*/
?>[/code]
Jak widać wyświetlenie zmiennej $str1 i $str2 daje zupełnie inne wyniki. Powodem jest fakt, iż ciągi objęte w cudzysłowy ( " ) są przez PHP interpretowane, natomiast ciągi objęte w apostrofy ( ' ) już nie. Ciąg objęty w cudzysłowy musi być zatem przez PHP przeparsowany i przetworzony w celu m.in. podstawienia wartości ewentualnie występujących w nim zmiennych, co za tym idzie - jest to jakieś dodatkowe zadanie dla procesora.

Ciąg natomiast objęty w apostrofy jest z marszu traktowany jako zwykły, najzwyklejszy tekst i nie jest w żaden sposób przetwarzany, co za tym idzie - jest "obrabiany" przez PHP o wiele szybciej. Różnicę zauważymy też m.in. w przetwarzaniu znaków specjalnych, jak np. znak końca linii:
[code]
<?php
$str1 = "To jest pierwsza linia.\nTo jest druga linia.";
$str2 = 'To jest pierwsza linia.\nTo jest druga linia.';
?>[/code]
Wyświetlenie teraz zmiennej $str1 pokaże nam:
[code]
To jest pierwsza linia.
To jest druga linia.[/code]

Natomiast wyświetlenie drugiej zmiennej - $str2 pokaże:
[code]To jest pierwsza linia.\nTo jest druga linia.[/code]
W drugim przypadku znak \n nie zostanie w żaden sposób przetworzony na znak końca linii i potraktowany "na surowo".

Trzeba mieć też świadomość, że ciąg objęty w cudzysłowy jest przetwarzany przez PHP nawet wtedy, gdy nie ma w nim żadnych zmiennych, ani żadnych znaków specjalnych (trzeba przecież przeparsować wszystko, aby sprawdzić czy takowe nie występują). Jest to obciążenie dla interpretera i powinno się tego unikać. Pamiętajmy zatem więc, żeby zawsze wszędzie tam, gdzie nie ma konieczności używania cudzysłowów (a czasem taka potrzeba jest) używać zwykłych apostrofów.

czwartek, 28 maja 2015

[PHP][GD2] Używanie czcionek TrueType

TRUE
3802236720239978412
Standardowa czcionka używana do tworzenia tekstu za pomocą imagestring() łagodnie rzecz ujmując pozostawia wiele do życzenia, warto zatem wiedzieć, że za pomocą biblioteki GD można "pisać" po obrazie dowolną czcionką. Czcionek w internecie znajdziemy multum, wybór ograniczony jest tutaj jedynie wyobraźnią.

Co najlepsze - dołączenie zewnętrznej czcionki nie wymaga w GD jakiś specjalnych zabiegów - wszystko sprowadza się do pobrania pliku .ttf z zadaną czcionką TrueType, umieszczeniu go na serwerze, a następnie dołączeniu go do skryptu. W tym bardzo krótkim wpisie pokażę jak za pomocą kilku linijek kodu wygenerować efekt taki jak na obrazku poniżej:


Czcionka na powyższym obrazku została dołączona za pomocą PHP, nie została dodana w żadnym programie graficznym. Nazywa się Nasty i możecie ją pobrać stąd. Zdjęcie na jakim wygenerowano napis stąd. Opiszę teraz w skrócie jak za pomocą zewnętrznej czcionki wygenerować na obrazie napis jak wyżej. Na początek pobierzmy sobie tą czcionkę (plik .ttf) w celach testowych i zapiszmy w katalogu, gdzie pisać będziemy nasz kod. Do pisania czcionką TrueType, którą załączamy z zewnetrznego pliku .ttf służy funkcja:

[code]imagettftext($image, $font_size, $angle, $x, $y, $color, $font, $text);[/code]
gdzie:

  • $image - uchwyt do obrazu
  • $font_size - rozmiar czcionki w px
  • $angle - kąt obrotu czcionki w stopniach
  • $x - współrzędna X, od której zaczynamy pisanie
  • $y - współrzędna Y, od której zaczynamy pisanie
  • $color - kolor czcionki
  • $font - nazwa pliku z czcionką
  • $text - pisany tekst


[PHP][GD2] Prosty gradient i operacje na kolorach pikseli

TRUE
5943953589183166087
W bibliotece GD mamy pełną kontrolę nad każdym pikselem składającym się na wynikowy obrazek. Możemy dowolnie pobierać jego wartości i ustawiać nowe. Możliwość taka, w połączeniu z odpowiednio skonstruowanymi pętlami pozwala na bardzo wiele, m.in. na generowanie gradientów, czyli przejść pomiędzy kolorami.

Funkcje do tworzenia złożonych gradientów są dość obszerne, my tutaj postaramy się nauczyć podstaw tworzenia prostych gradientów polegających na liniowym przejściu pomiędzy kolorami. Nauczymy się też operować na pikselach - pobierać oraz modyfikować ich wartości.

Tworzymy gradient

Popatrzmy na poniższy obrazek:

[PHP][GD2] Manipulacje obrazami

TRUE
6962189171884698785
Dzięki bibliotece GD możemy manipulować dowolnymi obrazami zapisanymi w formatach JPEG, PNG, GIF i BMP. Możemy dokonywać na nich operacji takich samych jakie robiliśmy w poprzednich artykułach, a więc rysować po nich, pisać, a także łączyć je, skalować, obracać i wiele innych rzeczy. W artykule tym nauczymy się wczytywania obrazków z plików, manipulacji na nich, takich jak skalowanie, czy dodawanie do nich innej grafiki, a także zapisywania wygenerowanych i zmodyfikowanych obrazów do pliku.

Warto dokładnie zapoznać się choćby z podstawowymi funkcjami służącymi do manipulacji grafiką, tak aby móc następnie wykorzystywać to w praktyce, np. podczas generowania, czy tworzenia miniaturek dla zdjęć, bądź dodawania znaków wodnych do zdjęć. Zastosowań jest multum, zatem zaczynamy.

Na początek nauczymy się wczytywać grafikę z pliku. Jak wspomniałem na początku - mamy tutaj zaimplementowaną obsługę kilku formatów plików. Praca z nimi niczym się od siebie nie różni, używamy do tego jedynie odpowiednio innych funkcji.

Wczytanie obrazka z pliku - imagecreatefrom()

W poprzednich atykułach na samym początku tworzyliśmy uchwyt do pustego obrazka i dopiero potem na nim pracowaliśmy, rysując figury jak prostokąty, czy elipsy. Teraz zamiast tworzyć pusty obrazek, wczytamy go z pliku JPG.

Do wczytania obrazka z pliku służy kilka funkcji, w zależności od tego jaki format chcemy wczytać. I tak, np.
[code]
imagecreatefromjpeg($nazwa_pliku) //wczytuje obrazek z pliku JPG
imagecreatefrompng($nazwa_pliku) //wczytuje obrazek z pliku PNG
imagecreatefromgif($nazwa_pliku)  //wczytuje obrazek z pliku GIF
imagecreatefrombmp($nazwa_pliku)  //wczytuje obrazek z pliku BMP
[/code]

Na początek naszej pracy pobierzmy sobie dwa poniższe zdjęcia do testów i zapiszmy sobie je w folderze, w którym pisać będziemy nasz kod. Żeby nam się przyjemnie pracowało, to na obu mamy 2 piękne panie :)


oraz



środa, 27 maja 2015

[PHP][GD2] Rysujemy podstawowe kształty

TRUE
5828360592528357317
Za pomocą biblioteki GD możemy nie tylko rysować prostokąty, lecz tworzyć o wiele bardziej złożone kształty, rysować linie, czy dodawać tekst. Wszystko sprowadza się do podania odpowiednich współrzędnych dla funkcji rysujących, a następnie wygenerowania danego kształtu i wypełnienia go odpowiednim kolorem. Warto poznać kilka podstawowych funkcji, takich jak rysowanie okręgów, czy elips, lub też prowadzenia linii z punku a do punktu.

W tej krótkiej części przyjrzymy się najczęściej używanym, podstawowym funkcjom służącym do rysowania na obrazku standardowych kształtów. W poprzedniej części, w podstawach narysowaliśmy prosty prostokąt, tym razem na początek narysujmy sobie elipsę. Wróćmy jednak jeszcze na moment do rysowania wypełnionego prostokąta z poprzedniej części. Użyliśmy tam funkcji:
[code]imagefilledrectangle()[/code]

[PHP][GD2] Podstawy generowania grafiki

TRUE
5540378502607286314
Biblioteka GD2 wbudowana w PHP to bardzo rozbudowane narzędzie, pozwalające na generowanie właściwie każdego rodzaju grafiki bitmapowej. Dzięki niej możemy generować grafikę bezpośrednio z poziomu PHP, co za tym idzie również manipulować istniejącą grafiką zapisaną w plikach takich jak JPEG, PNG, czy BMP, a więc tworzyć różnego rodzaju miniaturki, skalować i obracać zdjęcia, nakładać "w locie" filtry, znaki wodne, bądź napisy z zewnętrznych czcionek TrueType.

Biblioteka ta nadaje się również świetnie do generowania wszelkiego rodzaju graficznych wykresów reprezentujących dane pobrane bezpośrednio z PHP. Wygenerowane grafiki możemy następnie wyświetlać bezpośrednio do przeglądarki, albo zapisywać do plików. W artykule tym nauczymy się podstawowej zasady działania biblioteki i dowiemy się w jaki sposób wykorzystywać ją w kodzie.

1. Tworzymy pusty obrazek - imagecreatetruecolor()

Pierwszą podstawową rzeczą podczas pracy z GD2 jest stworzenie uchwytu do obrazka. Każda zabawa z GD2 rozpoczyna się od tego. Będziemy operować na pełnej palecie barw, więc nasz obrazek będziemy tworzyć za pomocą funkcji:
[code]$image = imagecreatetruecolor(szerokość_obrazka, wysokość_obrazka)[/code]

[PHP] Funkcje anonimowe i callback

TRUE
2147216564926567225
Funkcje anonimowe i związane z nimi funkcje zwrotne (tzw. callback) to bardzo praktyczny mechanizm pozwalający na tworzenie bardzo ciekawych rozwiązań. Są wykorzystywane w wielu funkcjach wbudowanych w PHP, możemy też je wykorzystywać do budowania własnych tego typu rozwiązań. Trzeba bowiem wiedzieć, że jako argumenty do danej funkcji możemy w PHP przekazywać nie tylko zwykłe typy takie jak obiekty klas, zmienne, czy tablice, ale również i funkcje.

Co więcej - funkcje podane jako argument mogą operować na danych zwróconych przez funkcję wywoływaną - nazywamy je wtedy funkcjami zwrotnymi, tzw. callbackami. Oczywiście nic nie stoi na przeszkodzie, aby wszystko działało o wiele bardziej skomplikowanie - funkcja zwrotna może np. odbierać wynik, przetwarzać go, a następnie ponownie przekazywać do funkcji bazowej. W tym artykule dowiemy się w jaki sposób w PHP można deklarować tego typu funkcje oraz zobaczymy na przykładzie w jaki praktyczny sposób można to rozwiązanie wykorzystać.

function()

Funkcja anonimowa może zostać zadeklarowana na dwa sposoby, na początek poznamy pierwszy sposób. Nie musi ona posiadać swojej nazwy, można ją jednak przypisać do zmiennej i używać zmiennej tak jakby była zwykłą funkcją.
Składnia taka moze powodować zdziwienie na pierwszy rzut oka, ale po zrozumieniu mechanizmu nie będzie w niej dla nas niczego dziwnego. Zdeklarujmy więc naszą pierwszą anonimową funkcję, przypisując ją do zmiennej:
[code]
<?php
$myFunction = function() {
  echo 'This is myFunction.<br />';
};
?>
[/code]

niedziela, 24 maja 2015

[PHP] Namespaces - przestrzenie nazw w PHP

TRUE
2394048099834356901
Zapewne spotkaliśmy się już z dziwnie wyglądającymi nazwami klas w PHP, np. podczas pracy z trochę bardziej rozbudowanymi webaplikacjami. Przykładowa nazwa jakiejś klasy mogła wyglądać np. tak: Bundle\HelloBundle\Controller\HelloController. Nie ma tu jednak żadnej pokręconej magii, a jedynie przestrzeń nazw. Klasa w tym przypadku ma jak najbardziej normalną nazwę HelloController, a wszystko to co znajduje się przed jej nazwą to przestrzeń nazw w jakiej się ona zawiera.
Korzystanie z przestrzeni nazw znacznie usprawnia pracę z kodem, a także eliminuje problem kolizji, gdzie dwie klasy mogą mieć identyczne nazwy. Przestrzenie nazw pozwalają również na stworzenie bardzo logicznej i przejrzystej hierarchi naszego kodu. W tym krótkim tutorialu dowiemy się czym są i jak  poprawnie używać przestrzeni nazw w PHP.

Funkcjonalność ta niczym nie różni się od tego samego rozwiązania stosowanego od zarania dziejów w językach takich jak C, czy Java. Przestrzenie nazw w PHP zostały dodane dość późno, bo dopiero w wersji 5.3.

Przestrzeń globalna

Jest główną przestrzenią nazw. Zauważmy, że bardzo często piszemy sobie jakieś klasy, czy też funkcje, bądź też korzystamy z tych wbudowanych w silnik PHP. Korzystamy np. z funkcji header() służacej do ustawienia nagłówka, funkcji strip_tags() służącej do obcięcia tagów HTML i wielu innych. Nazewnictwo tych funkcji jest proste i składa się z jednego członu określającego nazwę funkcji. Funkcje takie istnieją w domyślnej przestrzeni nazw i są dostępne wszędzie w naszym kodzie.

Podobnie jest z klasami, ich metodami i właściwościami. Nie wymagają poprzedzania ich nazwy nazwą przestrzeni w jakiej występują, gdyż globalna przestrzeń jest tą domyślną, bazową. Wyobraźmy sobie teraz, że tworzymy własną klasę, np. niech to będzie klasa o nazwie:
[code]MyClass {}[/code]

czwartek, 21 maja 2015

[PHP][cURL] Podstawy cz.5 - obsługa przekierowań

TRUE
4123571317394950562
Bardzo często odwołując się do danego zasobu zostajemy przekierowani w inne miejsce często nawet tego nie zauważając. W przypadku takim wysyłany jest przez serwer kod statusu z klasy 3xx, mówiący o typie danego przekierowania. Przekierowania takie często tworzymy sami, wywołując pehapową funkcję header("Location: /przekierowanie/do/")

Przekierowanie to zwraca zwraca do klienta kod statusu 302 Found, zamiast 200 OK. Kod 200 OK wysyłany jest dopiero po nastąpieniu przekierowania do wywoływanego w Location: pliku.  Biblioteka cURL domyślnie nie podąża za takimi przekierowaniami, a odbiera jedynie nagłówek informujący o istnieniu przekierowania. Aby zmienić zachowanie cURL-a i nakazać mu podążanie za takimi przekierowaniami, musimy ustawić następującą opcję:
[code]curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);[/code]
Przetestujmy to na przykładzie. Najpierw z nieustawionym podążaniem za przekierowaniem, a potem z ustawionym. W folderze na serwerze, gdzie trzymamy nasze przygotowane w części pierwszej pliki client.php i server.php stwórzmy jeszcze jeden plik o nazwie:
[code]redirected.php[/code]
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji