Objektum Orientalt Fejlesztes PHP5-ben

10,455 views
10,360 views

Published on

Bevezetes a PHP5 objektumorientalt lehetosegeibe.

Published in: Technology, Education
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
10,455
On SlideShare
0
From Embeds
0
Number of Embeds
77
Actions
Shares
0
Downloads
0
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Objektum Orientalt Fejlesztes PHP5-ben

  1. 1. Objektum-Orientált fejlesztés PHP(5) nyelven Simon Bence 2009-09-17
  2. 2. Mi az az objektum-orientáltság?
  3. 3. Programozási paradigma + Absztrakció
  4. 4. “ Egymással kommunikáló objektumok rendszere
  5. 5. Objektum? Adat és a rajta értelmezett művelet
  6. 6. Elemi entitás & Való világ modellezése & Absztrakt fogalmak megjelenése a programban
  7. 7. ?
  8. 8. Például: “téglalap”
  9. 9. (Adat) A téglalapnak van... ...“a” oldala ...”b” oldala
  10. 10. (Művelet) A téglalap tud... ... teruletSzamitas() ... keruletSzamitas()
  11. 11. Téglalap Téglalap Téglalap Téglalap Téglalap Téglalap Téglalap Téglalap Téglalap
  12. 12. Téglalap Téglalap Téglalap Téglalap Téglalap Téglalap Téglalap Téglalap Téglalap { Osztály
  13. 13. Osztály? Az objektumok viselkedését definiáló leírás
  14. 14. Jó-e ez nekem?
  15. 15. Igen! De miért is?
  16. 16. Miért? - Karbantarthatóság - Bővithetőség - Újrafelhasználhatóság - Fejlesztési idő csökkentése
  17. 17. Karbantarthatóság - a kódoknak egyszer kell szerepelniük - minden kódnak jól meghatározható hely - lehetőség egységtesztekre + a kommentek fontosak
  18. 18. Bővíthetőség - leszármaztatás
  19. 19. Újrafelhasználhatóság - kohézív osztályok - felületre tervezés (hordozhatóság)
  20. 20. Nem velejárója, lehetősége!
  21. 21. Az objektumkezelés költsége
  22. 22. class A { public function test($a) { $a += 1; } } function test($a) { $a += 1; } $array = array();
  23. 23. $time = microtime(true); for ($i = 0; $i < 50; $i++) {     $array[$i] = new A(); } echo microtime(true) - $time, '<br/>'; // 0.00006s $a = new A(); $time = microtime(true); for ($i = 0; $i < 500; $i++) {     $a->test(1); } echo microtime(true) - $time, '<br/>'; // 0.00047s $time = microtime(true); for ($i = 0; $i < 500; $i++) {     test(1); } echo microtime(true) - $time, '<br/>'; // 0.00043s
  24. 24. Az objektumok és osztályok
  25. 25. $circle = new Circle();
  26. 26. $circle1 = new Circle(); $circle2 = new Circle(); $circle3 = new Circle(); ...
  27. 27. “ Az objektum egy valós, vagy absztrakt, azonosítható, egyedi entitás, amely a vizsgált környezet egy jól definiált szereplője
  28. 28. “ Az adat és a rajta értelmezett művelet együttese
  29. 29. “ Az objektum egy rendszer egyedileg azonosítható szereplője, amelyet a külvilág felé mutatott viselkedésével, belső struktúrájával és állapotával jellemezhetünk
  30. 30. Gyártsunk objektumot! (A konstruktor)
  31. 31. Konstruktor: - Objektumszintű metódus - Inicializáló blokk - Lehetnek paraméterei - Csak egy lehet belőle - Általában publikus
  32. 32. Például... class Rectangle { protected $a; protected $b; public function __construct() { $this->a = 3; $this->b = 5; } } $t = new Rectangle();
  33. 33. Vagy... class Rectangle { protected $a; protected $b; public function __construct($a, $b) { $this->a = $a; $this->b = $b; } } $t = new Rectangle(3, 5);
  34. 34. << Osztály >>
  35. 35. “ Az osztály tehát egy sablon, ami az adott fogalom tulajdonságait (attribútum) és a neki küldhető üzeneteket (metódusok) írja le, mint egy model
  36. 36. $attribútumok Az osztályban meghatározott tulajdonságok
  37. 37. { Bármilyen PHP változótípus lehet Akár másik osztály is }
  38. 38. { $foo; $bar = 5; $something = “interesting text”; $array = array(); $anOtherArray = array(‘a’, ’b’, ’c’); $object = new Object();
  39. 39. állapot Az attribútumok összessége, jellemzi az objektumot
  40. 40. “ Az objektum állapotát az objektum attribútumai által felvett értékek összessége írja le
  41. 41. Pl.: Triangle: $a = 7 $b = 6 $c = 5
  42. 42. public function metódusok() { /.../ }
  43. 43. “ Az objektum metódusokon keresztül kommunikál a külvilággal és ezek változtathatják meg az állapotát
  44. 44. class Triangle { protected $a; protected $b; protected $c; public function getA() { return $this->a; } public function setA($a) { $this->a = $a; } } $t = new Triangle(); $t->setA(9); echo $t->getA();
  45. 45. Az objektumok törlése
  46. 46. Az objektumok törlése Garbage collector
  47. 47. Nem lehetünk biztosak benne :( Elvben: alapvetöen, amint tud, töröl
  48. 48. __destruct() Objektum törlésekor
  49. 49. register_shutdown_function() Script végén
  50. 50. register_shutdown_function() Hibalehetöség! Vigyázzunk! (Pl. adatbázis kapcsolat lezárása)
  51. 51. Coupling
  52. 52. $a = new A(1, 2, 3); $b = new B(4, 5); ... és A kódjában: public function foo($b) { $b->var = $this->var; }
  53. 53. $a = new A(1, 2, 3); $b = new B(4, 5); ... és A kódjában: public function foo($b) { $b->setVar($this->var); }
  54. 54. Tervezési cél: A kötések csökkentése, az egyes objektumok csak annyit tudjanak egymásról, amennyit szükséges (API-ra tervezés)
  55. 55. IS A / HAS A
  56. 56. HAS A 1: Gyenge tartalmazás (aggregáció) rész-egész kapcsolat, a részek alkotják az egészet
  57. 57. HAS A 2: Erős tartalmazás (kompozíció) a rész szorosan tartozik az egészhez, a részek nem élik túl az egészet
  58. 58. Cohesion
  59. 59. class SomethingWrong { public function makeSandwich() { /.../ } public function countApples() { /.../ } public function deleteOldEntries() { /.../ } public function someOtherSillyThing() { /.../ } }
  60. 60. Tervezési cél: A kohézió növelése, az objektumok “jól-fókuszáltsága”
  61. 61. Az objektum-orientáltság alapelvei és eszközei
  62. 62. Egységbe zárás (Encapsulation)
  63. 63. Hm? -OOP alapelv - Adattagok és metódusok osztályba foglalása - Állapot és viselkedés együtt
  64. 64. Adatrejtés (Data hiding)
  65. 65. Egységbe zárás Adatrejtés
  66. 66. Láthatósági szintek
  67. 67. Hozzáférési kategóriákkal szabályozhatjuk
  68. 68. Public Olyan attribútumok és metódusok, melyek korlátozás nélkül láthatóak a külvilág felé
  69. 69. Protected Olyan attribútumok és metódusok, melyekhez a külvilág nem fér hozzá, de leszármazott osztályok hozzáférnek
  70. 70. Private Olyan attribútumok és metódusok, melyekhez a külvilág nem fér hozzá. A leszármazott osztályok se látják!
  71. 71. A hozzáférést a tag elé írt módosítóval jelezzük... public function foo($b) { /.../ } ... vagy ... protected $variable;
  72. 72. Adattagokhoz kívülről csak metódussal lehessen hozzáférni!
  73. 73. Alapértelmezetten a láthatóság public
  74. 74. Öröklődés (Inheritence)
  75. 75. Az osztályok hierarchiába szervezése, öröklési lánc segítségével
  76. 76. Specializálás (A láncon lefele tekintve specializáció (és kiegészülés), felfele nézve általánosítás)
  77. 77. class Shape { /.../ }
  78. 78. class Shape { /.../ } class Circle extends Shape { /.../ }
  79. 79. class Shape { /.../ } class Circle extends Shape { /.../ } class Triangle extends Shape { /.../ } class Rectangle extends Shape { /.../ }
  80. 80. “ A leszármazott osztály megkapja az ős összes attribútumát és metódusát
  81. 81. class Fruit { public function eat() { echo “nyami”; } } class Orange extends Fruit { } $orange = new Orange(); $orange->eat(); // Eredmény: nyami
  82. 82. Dinamikus kötés class A { protected $text = ‘Hello!’; public function sayHello() { echo $this->text; } } class B extends A { protected $text = ‘Namaste!’; } $b = new B(); $b->sayHello(); Namaste!
  83. 83. Óvatosan a hierarchia kialakításával! (http://www.snopes.com/humor/nonsense/kangaroo.asp)
  84. 84. StdClass { /.../ }
  85. 85. Többszörös öröklődés
  86. 86. Többszörös öröklődés Nincs!
  87. 87. Többszintű öröklődés
  88. 88. class Shape { /.../ } class Circle extends Shape { /.../ } class Triangle extends Shape { /.../ } class Rectangle extends Shape { /.../ } class Square extends Rectangle { /.../ }
  89. 89. Metódus felülírás (Method override)
  90. 90. class Fruit { public function eat() { echo 'nyam-nyam'; } } class Apple extends Fruit { public function eat() { echo 'nyum-nyum'; } }
  91. 91. parent::
  92. 92. class Fruit { public function eat() { echo 'nyam-nyam'; } } class Apple extends Fruit { public function eat() { echo 'nyum-nyum'; parent::eat(); } } // Eredmény: nyam-nyamnyum-nyum
  93. 93. Absztrakt osztályok (Abstract classes)
  94. 94. Általánosítástetején van) (Jól látszik abból, hogy az öröklési fa
  95. 95. Metódus >> Osztály
  96. 96. Szabályok - Metódus: nincs törzse - Osztály: nem példányosítható
  97. 97. Leszármazottjai is absztraktnak minősülnek, amíg nem implementálják az összes metódust
  98. 98. abstract class A { abstract function foo(); } $a = new A(); HIBA!
  99. 99. Többalakúság (Polimorphism)
  100. 100. IS A
  101. 101. Rectangle IS A Shape
  102. 102. “ Egy objektum nem csak saját osztályának, de összes ős osztályának és interface példányának is tekinthető
  103. 103. public function paintThis(Shape $s) { /.../ } $shape = new Shape(); ...->paintThis($shape)
  104. 104. public function paintThis(Shape $s) { /.../ } $rectangle = new Rectangle(); ...->paintThis($rectangle)
  105. 105. Interface-ek is!
  106. 106. Type hint public function foo(someClass $var) { /.../ }
  107. 107. Metódus túlterhelés (Method overload)
  108. 108. Azonos nevű, de más szignatúrájú metódusok
  109. 109. Nincs!
  110. 110. Ilyen nincs! class Pear { public function foo() { /* ... */ } public function foo($var) { /* ... */ } /* more code */ }
  111. 111. De még csak ilyen se! class Pear { public function foo() { /* ... */ } protected function foo($var) { /* ... */ } /* more code */ }
  112. 112. Sőt, ilyen sem! class Pear { public function foo() { /* ... */ } public static function foo($var) { /* ... */ } /* more code */ }
  113. 113. Megkerülhető: func_get_args()
  114. 114. Statikus módosító (Static modifier)
  115. 115. Attribútum & Metódus
  116. 116. self::
  117. 117. class Apple { protected static $number = 0; public function __construct() { self::$number = self::$number + 1; } public static function getNumberOfApples() { return self::$number; } } $a = new Apple(); echo Apple::getNumberOfApples();
  118. 118. Late static binding
  119. 119. class A { protected static $text = ‘Hello!’; public static function sayHello() { echo self::$text; } } class B extends A { protected static $text = ‘Namaste!’; } B::sayHello();
  120. 120. Hello! PHP 5.3-ig
  121. 121. Statikus tag SOHA nem ér el objektumszintű tagot
  122. 122. class Apple { protected $color = ‘red’; public function __construct($color) { $this->color = $color; } public static function getColor() { return $this->color; } } $a = new Apple(‘green’); Apple::getColor(); HIBA
  123. 123. Interface-ek (Interface)
  124. 124. “ Üzenetküldési szabályok definiálása
  125. 125. interface Drinkable { public function drink(); }
  126. 126. Csak publikus metódus definiálható!
  127. 127. implements
  128. 128. class Beer implements Drinkable { public function drink() { //something good } }
  129. 129. Implementálás szabályai -Több interface-t is implementálhat - Minden metódusát meg kell valósítsa - A megvalósítás szignatúrájának egyezni kell
  130. 130. Final módosító (Final modifier)
  131. 131. Kőbe vésett!
  132. 132. Osztály & metódus
  133. 133. Abstract & Final
  134. 134. Óvatosan!
  135. 135. Műveletek objektumokkal
  136. 136. if ( Objektum összehasonlítása ){
  137. 137. [ Egymással ]
  138. 138. Állapotok összehasonlítás $a == $b
  139. 139. Pointer összehasonlítás $a === $b
  140. 140. [ Osztályokkal (és interface-ekkel) ]
  141. 141. is_a & instanceof get_class, get_parent_class, is_subclass_of
  142. 142. Objektumok másolása Objektumok másolása másolása Objektumok
  143. 143. Klónozás
  144. 144. $copyOfObject = clone $object
  145. 145. shallow copy Az attribútum objektum-mutatója másolódik le: ugyanarra az objektumra mutat, mint az eredeti default
  146. 146. deep copy Az attribútum objektum állapota másolódik le. Másik, innentől független objektum
  147. 147. & másik pointer létrehozása
  148. 148. $a = new Foo(); $a->setValue(3);
  149. 149. $a = new Foo(); $a->setValue(3); $b = $a; $b->getValue() // Az eredmény: 3
  150. 150. $a = new Foo(); $a->setValue(3); $b = $a; $b->getValue() // Az eredmény: 3 $b->setValue(5); $a->getValue() // Az eredmény: 5
  151. 151. Objektum iteráció (PHP5)
  152. 152. class Example { public $var1 = 1; public $var2 = 2; public $var3 = 3; protected $var4 = 4; protected $var5 = 5; public function iterateAttributes() { foreach ($this as $key => $value) { echo $key.’: ‘.$value.PHP_EOL; } } }
  153. 153. $e = new Example(); $e->iterateAttributes(); // Eredmény: 1, 2, 3, 4, 5
  154. 154. foreach ($e as $key => $value) { echo $key.’: ‘.$value.PHP_EOL; } // Eredmény: 1, 2, 3
  155. 155. Óvatosan! (Láthatóság)
  156. 156. Mágikus metódusok
  157. 157. Speciális segítő függvények
  158. 158. __névtér()
  159. 159. publikus
  160. 160. __construct __destruct __clone
  161. 161. __toString()
  162. 162. echo, print, printf... class Foo { $varA = 42; $varB = 'life'; public function __toString() { return $varA.', '.$varB; } } $a = new Foo(); echo $a;
  163. 163. __call()
  164. 164. class Example { public function __call($method, $argument) { echo $method; } } $object = new Example(); $object->foo(); // eredmény: ‘foo’
  165. 165. __callStatic() PHP 5.3!
  166. 166. __set() & __get()
  167. 167. class Container { protected $data = array(); public function __get($name) { return $this->data[$name]; } public function __set($name, $value) { $this->data[$name] = $value; } } $a = new Container(); $a->something = 20; echo $a->something;
  168. 168. __isset() & __unset()
  169. 169. class Container2 extends Container { public function __isset($name) { return isset($this->data[$name]); } public function __unset($name) { unset($this->data[$name]); } } $a = new Container(); isset($a->name); unset($a->name);
  170. 170. __sleep() & _wakeup()
  171. 171. __set_state() __toString()
  172. 172. var_export...
  173. 173. +1 __invoke() PHP 5.3!
  174. 174. Egyéb lehetőségek
  175. 175. { Kivételkezelés }
  176. 176. throw new Exception(“This is gonna be bad”);
  177. 177. include __autoload()
  178. 178. function __autoload($className) { require_once $DOCUMENT_ROOT.“classes/class.”.$className.“.php”; } & regisztrálás az spl_autoload_register függvénnyel
  179. 179. Hova tovább?
  180. 180. Lehetőségek... - UML - Tervezési minták - Objektumorientált adatmodell - Fejlesztési módszertanok - Reflection api
  181. 181. Lehetőségek... - UML - Tervezési minták - Objektumorientált adatmodell - Fejlesztési módszertanok - Reflection api
  182. 182. Lehetőségek... - UML - Tervezési minták - Objektumorientált adatmodell - Fejlesztési módszertanok - Reflection api
  183. 183. Lehetőségek... - UML - Tervezési minták - Objektumorientált adatmodell - Fejlesztési módszertanok - Reflection api
  184. 184. Lehetőségek... - UML - Tervezési minták - Objektumorientált adatmodell - Fejlesztési módszertanok - Reflection api
  185. 185. getConstants getDocComment isProtected getName hasMethod isAbstract isOptional isInterface getStartLine isUserDefinied getModifierNames getDefaultValue getParentClass returnsReference export getFileName invoke getMethod setAccessible
  186. 186. Köszönöm!
  187. 187. Kérdések? http://download.perfectmess.hu/oop.ppt

×