OOP Objektorientierte Programmierung in PHP - Part 6

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • In diesem Tutorial möchte ich die OOP in PHP vorstellen. Ich gehe von PHP Grundkenntnissen und der Kentniss darüber, wie man Funtionen schreibt, aus, alles andere wird erklärt! Im sechsten Part werde ich die Klassenabstraktion erklären.
    Hallo liebe Community!

    Dies ist mein erstes Tutorial also seit nicht zu streng mit der Kritik, über Verbesserungsvorschläge würde ich mich dennoch freuen!

    Ich setze voraus, dass man weiß wie Funktionen geschrieben werden und dass man mit Variablen umgehen kann. Außerdem sollte man folgende Parts meines Tutorials gelesen haben:
    • [wiki]OOP Objektorientierte Programmierung in PHP - Part 1[/wiki]
    • [wiki]OOP Objektorientierte Programmierung in PHP - Part 2[/wiki]
    • [wiki]OOP Objektorientierte Programmierung in PHP - Part 3[/wiki]
    • [wiki]OOP Objektorientierte Programmierung in PHP - Part 4[/wiki]
    • [wiki]OOP Objektorientierte Programmierung in PHP - Part 5[/wiki]


    Dieser Part behandelt die Vererbung nochmal genauer.

    Hier der Quellcode den ich in diesem Part besprechen will. Er setzt sich aus dem Quellcode von Part 4, dem Wissen aus Part 5 und dem neuen aus diesem Part zusammen:

    Quellcode

    1. abstract class Raumschiff
    2. {
    3. protected $leben; //protected ist aus Part 5
    4. protected $panzer;
    5. protected $ladung;
    6. public function __construct()
    7. {
    8. $this->leben = 100;
    9. $this->panzer = 100;
    10. $this->ladung = array();
    11. }
    12. public function fliegen()
    13. {
    14. echo "Captain, wir fliegen mit ".self::GESCHWINDIKEIT." Lichtjahren/Sekunde durchs All";
    15. }
    16. public function attacke()
    17. {
    18. echo "Captain, wir greifen mit ".self::ANGRIFFSWERT." Schuss/Sekunde an";
    19. }
    20. public function einladen($ware)
    21. {
    22. $bereitsGeladen = 0; //speichert was schon eingeladen wurde
    23. foreach($this->ladung as $geladen) //Schleife die alle ladungen durchläuft
    24. {
    25. $bereitsGeladen += $geladen->getPlatz(); //die "aktuelle" ware prüfen, wieviel platz sie braucht
    26. }
    27. if(($ware->getPlatz()+$bereitsGeladen)<=self::LADERAUM_KAPAZITAET) //passt die neue ladung noch rein?
    28. {
    29. $this->ladung[$ware->name] = $ware; //wenn ja, einladen
    30. } else
    31. {
    32. echo "Nicht genug Platz!"; //sonst fehler erzeugen
    33. }
    34. }
    35. public function ausladen($warenname)
    36. {
    37. $ware = $this->ladung[$warenname]; //ware zwischenspeichern
    38. unset($this->ladung[$warenname]); //ware ausladen
    39. return $ware; //zwischenspiecher zurückgeben
    40. }
    41. public function minorLeben($diff) //Leben verkleinern
    42. {
    43. if(is_numeric($diff)) //Das Leben muss um eine Zahl verkleinert werden
    44. {
    45. if($diff<0) //Wenn die Zahl kleiner als 0 ist...
    46. {
    47. $this->leben += $diff; //...wird eine negative Zahl zum leben hinzugefügt...
    48. } else //..sonst...
    49. {
    50. $this->leben -= $diff; //...wird die positive zahl abgezogen!
    51. }
    52. }
    53. }
    54. public function reparieren($diff) //Leben erhöhen
    55. {
    56. if(is_numeric($diff)) //Das Leben muss um eine Zahl verkleinert werden
    57. {
    58. if($diff>0) //Wenn die Zahl größer als 0 ist...
    59. {
    60. $this->leben += $diff; //...wird eine positive Zahl zum leben hinzugefügt...
    61. } else //..sonst...
    62. {
    63. $this->leben -= $diff; //...wird die negative zahl abgezogen! (minus und minus macht plus)
    64. }
    65. }
    66. }
    67. public function getLeben()
    68. {
    69. return $this->leben;
    70. }
    71. public function getPanzerung()
    72. {
    73. return $this->panzer;
    74. }
    75. }
    76. class Jaeger extends Raumschiff //Die Klasse Jäger "erbt" von der Klasse Raumschiff
    77. {
    78. const GESCHWINDIKEIT = 50;
    79. const ANGRIFFSWERT = 50;
    80. const LADERAUM_KAPAZITAET = 10;
    81. public function __construct()
    82. {
    83. parent::__construct(); //Standardwerte über den geerbten Konstruktor laden
    84. $this->panzer = 25; //Standard Panzerung ist nicht für den Jäger gültig...
    85. }
    86. }
    Alles anzeigen


    Das neue findet sich gleich in der 1.Zeile. Das keyword abstract (abstrakt). Wird eine Klasse als abstact definiert, so kann man keine Instanz dieser Klasse (also kein Objekt der Klasse) erzeugen. Man kann auch Methoden als abstract definieren, jedoch MUSS eine Klasse, sobald sie auch nur eine einzige abstakte Methode hat, auch abstrakt sein.
    Jetzt auf unsere Raumschiffe bezogen: es sollte NIE das Raumschiff "Raumschiff" geben, das ist ja nur der Prototyp für alle anderen Raumschiffe, deswegen muss diese Klasse abstract sein! Jetzt zu den abstract methods:

    Quellcode

    1. abstract class Raumschiff
    2. {
    3. //Das ganze BlaBla von oben
    4. abstract public function spezialLaserKanone();
    5. }
    6. class Jaeger extends Raumschiff
    7. {
    8. //auch das Bla von oben
    9. public function spezialLaserKanone()
    10. {
    11. echo "keine Laserkanone!";
    12. }
    13. }
    Alles anzeigen


    Wer möchte kann den Code mal ohne die Funktionsdefinition in der Klasse Jaeger laufen lassen. Das wird Fehler erzeugen! Einer abstrakten Methode wird kein Quellcode zugeordnet. Sie hat nur eine Funktion: die Kindklasse dazu "zwingen", eine Methode mit dem selben Namen und mit den selben Parametern (die Parameter dürfen sich nicht in Anzahl oder Namen unterscheiden) zu definieren. Dabei ist zu beachten das es nur strengere Sichtbarkeiten gibt. Also wenn man protected angegeben hat muss die Funktion nachher protected oder private sein.

    Das abstract keyword wird mit PHP 5 eingeführt und ist voher nicht verfügbar!

    Im nächsten Part wird nochmals auf Vererbung eingegangen.
    n0x-f0x

    9.096 mal gelesen