Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
PHP <ul><li>Personal Home Page/Forms Interpreter
Hypertext Preprocessor </li></ul>Patryk Jar
Podstawy PHP <ul><li>Składnia podobna do C/C++
Język skryptowy
Zmienne
Tablice
Ponowne wykorzystanie kodu </li></ul>Patryk Jar
Zmienne <ul><li>Typ zmiennej wskazówką, nie “obowiązkiem” <?PHP $foo = '123';    echo gettype($foo) . &quot;
&quot;; $off ...
Wynik:  “string integer są sobie równe”
Możliwe rzutowanie </li><ul><li>Jak w Javie: (int), (string) itp.
intval($foo), strval($foo), itp. </li></ul></ul>Patryk Jar
Zmienne tablicowe <ul><li>Osobny typ – Array()
Nie trzeba deklarować typu ani rozmiaru: $tab = Array('a',12,2.34); $tab = Array(0 => 'a', 1 => 12, 2 =>2.34); $tab[0] = '...
Tablice assocjacyjne $tab = Array( 'Adam' => 'Ewa',  'StudentETI' => 'Ivona'); $tab['.pl'] = 'Polska'; </li></ul>Patryk Jar
Funkcje (1) <ul><li>Składnia function nazwa($arg1, $arg2...) { ... }
Nie ma specjalnego bloku w kodzie na funkcje, nie stosuje się nagłówków na początku kodu (jak np. w C++)
Nie ma przeciążania
Parametry mogą mieć wartości domyślne function nazwa($arg1, $arg2 = 2) { };  // ok function nazwa($arg1 = 2, $arg2) { }; /...
Funkcje (2) <ul><li>Nie można wymusić typu zwracanego przez funkcję mixed print_r ( mixed $expression [, bool $return ] )
Brak kontroli typów function moja_funkcja($a) { ... }; moja_funkcja('Siała baba mak'); // ok moja_funkcja(12);  // ok moja...
Ponowne wykorzystanie kodu <ul><li>inluclude() / include_once() include_once('plik.php');
require() / require_once() require_once('../../folder/plik.htm');
Niemal identyczne
Różnica w przypadku niepowodzenia </li><ul><li>require() wygeneruje błąd krytyczny
include() wygeneruje ostrzeżenie </li></ul></ul>Patryk Jar
Zalety i wady <ul><li>Zalety: </li><ul><li>Łatwy do nauki (nie wymaga wiedzy o sprzęcie)
Prosty (szybko stworzysz coś, za co ci zapłacą)
Upcoming SlideShare
Loading in …5
×

Php P.Jar

873 views

Published on

Prezentacja Patryka Yarpo Jar.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Php P.Jar

  1. 1. PHP <ul><li>Personal Home Page/Forms Interpreter
  2. 2. Hypertext Preprocessor </li></ul>Patryk Jar
  3. 3. Podstawy PHP <ul><li>Składnia podobna do C/C++
  4. 4. Język skryptowy
  5. 5. Zmienne
  6. 6. Tablice
  7. 7. Ponowne wykorzystanie kodu </li></ul>Patryk Jar
  8. 8. Zmienne <ul><li>Typ zmiennej wskazówką, nie “obowiązkiem” <?PHP $foo = '123'; echo gettype($foo) . &quot; &quot;; $off = 123; echo gettype($off) . &quot; &quot;; if ($foo == $off) echo &quot; są sobie równe &quot; ; if ($foo === $off) echo ' są identyczne ' ; ?>
  9. 9. Wynik: “string integer są sobie równe”
  10. 10. Możliwe rzutowanie </li><ul><li>Jak w Javie: (int), (string) itp.
  11. 11. intval($foo), strval($foo), itp. </li></ul></ul>Patryk Jar
  12. 12. Zmienne tablicowe <ul><li>Osobny typ – Array()
  13. 13. Nie trzeba deklarować typu ani rozmiaru: $tab = Array('a',12,2.34); $tab = Array(0 => 'a', 1 => 12, 2 =>2.34); $tab[0] = 'a'; $tab[1] = 12; $tab[2] = 2.34; $tab[] = 'a'; $tab[] = 12; $tab[] = 2.34;
  14. 14. Tablice assocjacyjne $tab = Array( 'Adam' => 'Ewa', 'StudentETI' => 'Ivona'); $tab['.pl'] = 'Polska'; </li></ul>Patryk Jar
  15. 15. Funkcje (1) <ul><li>Składnia function nazwa($arg1, $arg2...) { ... }
  16. 16. Nie ma specjalnego bloku w kodzie na funkcje, nie stosuje się nagłówków na początku kodu (jak np. w C++)
  17. 17. Nie ma przeciążania
  18. 18. Parametry mogą mieć wartości domyślne function nazwa($arg1, $arg2 = 2) { }; // ok function nazwa($arg1 = 2, $arg2) { }; // BŁĄD </li></ul>Patryk Jar
  19. 19. Funkcje (2) <ul><li>Nie można wymusić typu zwracanego przez funkcję mixed print_r ( mixed $expression [, bool $return ] )
  20. 20. Brak kontroli typów function moja_funkcja($a) { ... }; moja_funkcja('Siała baba mak'); // ok moja_funkcja(12); // ok moja_funkcja(3.14); // ok </li></ul>Patryk Jar
  21. 21. Ponowne wykorzystanie kodu <ul><li>inluclude() / include_once() include_once('plik.php');
  22. 22. require() / require_once() require_once('../../folder/plik.htm');
  23. 23. Niemal identyczne
  24. 24. Różnica w przypadku niepowodzenia </li><ul><li>require() wygeneruje błąd krytyczny
  25. 25. include() wygeneruje ostrzeżenie </li></ul></ul>Patryk Jar
  26. 26. Zalety i wady <ul><li>Zalety: </li><ul><li>Łatwy do nauki (nie wymaga wiedzy o sprzęcie)
  27. 27. Prosty (szybko stworzysz coś, za co ci zapłacą)
  28. 28. Olbrzymia społeczność </li></ul><li>Wady: </li><ul><li>Wolne działanie
  29. 29. Zbyt prosty
  30. 30. Łatwo pisać “dziurawy” kod </li></ul><li>Wniosek: </li><ul><li>Idealny dla amatorów i hobbystów, ale czy tylko? </li></ul></ul>Patryk Jar
  31. 31. Obiektowy PHP <ul><li>PHP 3 </li><ul><li>Pierwszy mechanizm obiektowy
  32. 32. Klasy i obiekty jako inny sposób definiowania i korzystania z tablic asocjacyjnych </li></ul><li>PHP 4 </li><ul><li>Możliwość przesłałania metod i odwoływania się do nich z klas pochodnych
  33. 33. Nadal obiekty kopiowane przez wartość, nie referencję </li></ul><li>PHP 5 </li><ul><li>Obiekty w samym sercu języka </li></ul></ul>Patryk Jar
  34. 34. Prosta klasa (PHP5) class A { function __construct() { echo 'A '; } function __destruct() { echo '~A'; } function talk_to_me() { echo 'Czesc '; } } $oA = new A(); $oA->talk_to_me(); Wynik: “A Czesc ~A” Patryk Jar
  35. 35. Modyfikatory dostępu <ul><li>Public </li><ul><li>dostęp poza klasą </li><ul><li>W PHP4 wszystkie atrybuty były dostępne poza klasą </li><ul><li>Używano słowa kluczowego var </li></ul><li>W PHP5 var ~= public, w PHP6 var = public </li></ul></ul><li>Protected </li><ul><li>dostęp w klasie i klasach pochodnych </li></ul><li>Private </li><ul><li>dostęp tylko i wyłącznie w tej klasie </li></ul></ul>Patryk Jar
  36. 36. Składowe statyczne i stałe class A { static public $a = 11; const N = 12; static public function b() { echo 'Metoda statyczna ' . self::$a; } } A::$a = 10; A::b(); // wypisze “Metoda statyczna 10” echo A::N; // wypisze 12 Patryk Jar
  37. 37. Kopiowanie obiektów class A { public $id; public $name; function __construct($n) { $this->id = rand(0, 10); $this->name = $n; } function __clone() { $id = $this->id; while ($id == $this->id) $this->id = rand(0, 10); } function __toString() { return $this->id . ' ' . $this->name; } } $oA1 = new A('AAA'); $oA2 = clone $oA1; echo $oA1 . ' | ' . $oA2 // '5 AAA | 9 AAA' Patryk Jar
  38. 38. Dziedziczenie class A { public $a; function __construct($a) { $this->a = $a; } } final class B extends A { public $b; function __construct($b, $a) { $this->b = $b; parent::__construct($a); // wywołanie kostruktora kl. A } } class C extends B { } // błąd ! Nie można dziedziczyć po B $oB1 = new B('pies', 'kot'); echo $oB1->b . ' ' . $oB1->a; // pies kot Patryk Jar
  39. 39. Interfejsy interface A { public function f1(); public function f2(); } interface B { public function f3(); } class AA implements A, B { public function f1() { echo 'f1()'; } <ul>public function f2() { echo 'f2()'; </ul>public function f3() { echo 'f3()'; } } $oAA = new AA(); echo $oAA->f1() . ' ' . $oAA->f2() . ' ' . $oAA->f3(); Patryk Jar
  40. 40. Wyjątki class A { function __construct($a) { $this->f($a); echo &quot;nie ma wyjątku&quot;; } private function f($a) { if ($a == 1) throw new Exception(&quot;a = 1&quot;); } } $oA1 = new A(2); // “nie ma wyjątku” $oA2 = new A(1); /* Fatal error: Uncaught exception 'Exception' with message 'a = 1' */ Patryk Jar
  41. 41. Obsłużony wyjątek class A { function __construct($a) { try { $this->f($a); } catch(Exception $e) { die(&quot;jest wyjątek&quot;); } echo &quot;nie ma wyjątku&quot;; } private function f($a) { if ($a == 1) throw new Exception(&quot;a = 1!!!&quot;); } } $oA1 = new A(2); // “nie ma wyjątku” $oA2 = new A(1); // “jest wyjątek” - koniec działania skryptu-die() Patryk Jar
  42. 42. Przykład (1) abstract class ParamHandler { protected $source; protected $params = array(); function __construct($src) { $this->source = $src; } function addParam($key, $val) { $this->params[$key] = $val; } function getParam($key) { return $this->params[$key]; } static function getInstance($filename) { return (substr($filename, -4) == '.xml') ? new XmlParam($filename) : new TxtParam($filename); } abstract function write(); abstract function read(); } $oPH = new ParamHandler('plik.txt'); // błąd Patryk Jar
  43. 43. Przykład (2) class XmlParam extends ParamHandler { function write() { /* zapis do pliku xml, sformatowanie danych z tablicy params */ } function read() { /* odczyt z pliku xml, sparsowanie XML */ } } class TxtParam extends ParamHandler { function write() { /* zapis do pliku txt */ } function read() { /* odczyt z pliku txt */ } } $test = ParamHandler::getInstance('plik.txt'); $test->read(); echo $test->getParam('klucz'); $test->addParam('klucz2', 'wartosc1'); $test->write(); Patryk Jar
  44. 44. Metody - akcesory class B { public function a($n) { echo &quot;jestem w B::a( $n )&quot;; } } class A { private $handler; function __construct() { $this->handler = new B(); } public function __get($n) { return ($this->$n); } public function __set($n, $v) { $this->$n = $v; } public function __call($name, $args) { if (count($args) == 1 && method_exists($this->handler, $name)) return $this->handler->$name($args[0]); else echo 'Nie ma metody '.$name; } } $oA = new A(); $oA->a = 5; // wykorzystanie __set echo $oA->a; // wykorzystanie __get, wynik: 5 $oA->a(&quot;argument&quot;, 1); // __call, wynik: “nie ma metody a” $oA->a(&quot;argument&quot;); // __call, wynik: “jestem w B::a(argument)” Patryk Jar
  45. 45. Ciekawe konstrukcje class A { function __construct() { echo &quot;Budujemy A&quot;; $this->weird = &quot;Wcześniej mnie nie było&quot;; $this->display(); } private function display() { echo $this->weird; } } $tekst = &quot;A&quot;; $oA = new $tekst(); // “Budujemy A” Patryk Jar
  46. 46. Wzorce projektowe <ul><li>ang. Design patterns – uniwersalne, sprawdzone w praktyce rozwiązanie często pojawiających się, powtarzalnych problemów projektowych
  47. 47. Wzorce nie są wymyślane – są odkrywane </li></ul>Patryk Jar
  48. 48. Singleton <ul><li>Opis problemu: </li><ul><li>Konieczność wykorzystania zmiennych globalnych
  49. 49. Zbiór zmiennych globalnych nie powinien być przechowywany w zmiennej, którą można zamazać
  50. 50. W systemie nie może istnieć więcej, niż jeden egzemplarz “zbioru” zmiennych globalnych </li></ul><li>Rozwiązanie: wzorzec Singleton! </li></ul>Patryk Jar
  51. 51. Singleton(2) class Preferences { private $props = array(); private function __construct() { } // sic! public function setProperty($key, $val) { $this->props[$key] = $val; } public function getProperty($key) { return $this->props[$key]; } } $oP = new Preferences(); /* Fatal error: Call to private Preferences::__construct() */ Patryk Jar
  52. 52. Singleton (3) class Preferences { private $props = array(); private static $instance; private function __construct() { } public static function getInstance() { if (empty(self::$instance)) self::$instance = new Preferences(); return self::$instance; } public function setProperty($key, $val) { $this->props[$key] = $val; } public function getProperty($key) { return $this->props[$key]; } } $oP = Preferences::getInstance(); $oP->setProperty(&quot;JPO&quot;, &quot;wykład&quot;); unset($oP); // usuwamy $oP $oP2 = Preferences::getInstance(); echo $oP2->getProperty(&quot;JPO&quot;); // wynik : “wykład” Patryk Jar
  53. 53. PHP6 <ul><li>Określenie typów zwracanych przez funkcję
  54. 54. 64-bit integer
  55. 55. Koniec: </li><ul><li>Register Globals
  56. 56. Długich nazw zmiennych superglobalnych </li><ul><li>$_HTTP_*_VARS wycofane
  57. 57. $_GET, $_POST, $_SESSION nadal dostępne </li></ul><li>Tylko jeden sposób zagnieżdżania skryptów </li><ul><li><?PHP .... ?> </li></ul></ul><li>var === public
  58. 58. Kiedy? Cannot access private property PHP6::$kiedy :P </li></ul>Patryk Jar
  59. 59. Dziękuję za uwagę <ul><li>Bibliografia </li><ul><li>Matt Zandstra, “PHP5. Obiekty, wzorce, narzędzia”, Helion 2004
  60. 60. L. Welling, L. Thomson, “PHP i MySQL – Tworznie stron WWW. Vademecum profesjonalisty”, Wydanie 2., Helion 2003
  61. 61. www.php.net </li></ul></ul>Patryk Jar

×