php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 22.11.2010, 11:42  
Benutzer
 
Benutzerbild von echo
 
Registriert seit: 20.09.2008
Beiträge: 91
PHP-Kenntnisse:
Anfänger
echo ist zur Zeit noch ein unbeschriebenes Blatt
Standard Wozu brauche ich eigentlich eine abstrakte Klasse?

Hallo,

hab immer noch so meine Verständnis-Problemchen mit OOP.
Wozu brauche ich eigentlich eine abstrakte Klasse, wenn ich doch genau so gut jede andere Klasse erweitern kann??

Kleines Bsp.:
PHP-Code:
<?php
class tier{

  protected 
$_art;
  protected 
$_bez;

  public function 
setArt($art){
    
$this->_art $art;
  }

  public function 
getArt(){
    return 
$this->_art;
  }

  public function 
setBezeichnung($bez){
    
$this->_bez $bez;
  }

  public function 
getBezeichnung(){
    return 
$this->_bez;
  }
}

class 
fisch extends tier{

  protected 
$_name;

  public function 
__construct(){
    
parent::setArt('Fisch');
  }

  public function 
setSpezie($name){
    
$this->_name $name;
  }

  public function 
getSpezie(){
    return 
$this->_name;
  }
}

$fisch = new fisch();
$fisch->setBezeichnung('Fang A008');
$fisch->setSpezie('Barsch');
$bez $fisch->getBezeichnung();

if(
$fisch instanceof tier){
  echo 
"$bez ist ein Tier!<br />Genauer gesagt: ";
}
echo 
"$bez ist ein ".$fisch->getArt().' und zwar ein '.$fisch->getSpezie().'.';
//Man verzeihe mir Ungenauigkeiten bei den biologischen Termini hier ;-)
Zumindest in diesem Bsp. brauch ich doch nix Abstraktes, oder? Oder besser gefragt: In welchen Fällen sind abstrakte Klassen unverzichtbar SCHRÄGSTICH effizienter?

Danke für eine "Antwort für Dummies", denn natürlich gibst es unzähliges über OOP und auch abstact class im Netz zu finden, aber den Nutzen kapier ich einfach nicht!
echo ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 22.11.2010, 11:47  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Sowas in der Art wurde vor kurzem bereits schonmal hier diskutiert...

http://www.php.de/php-einsteiger/719...-abstract.html
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline  
Alt 22.11.2010, 11:51  
Erfahrener Benutzer
 
Benutzerbild von wolf29
 
Registriert seit: 17.03.2010
Beiträge: 1.838
PHP-Kenntnisse:
Fortgeschritten
wolf29 wird schon bald berühmt werdenwolf29 wird schon bald berühmt werden
Standard

Über google findest Du ne Menge Erklärungen dazu, z.B.:

http://www.peterkropff.de/site/php/a...te_klassen.htm
http://www.usegroup.de/software/phpt...entierung.html
usw.

Wolf29
__________________
while (!asleep()) sheep++;

Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.
wolf29 ist offline  
Alt 22.11.2010, 11:53  
Benutzer
 
Benutzerbild von echo
 
Registriert seit: 20.09.2008
Beiträge: 91
PHP-Kenntnisse:
Anfänger
echo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von lstegelitz Beitrag anzeigen
Sowas in der Art wurde vor kurzem bereits schonmal hier diskutiert...

http://www.php.de/php-einsteiger/719...-abstract.html
Hab ich natürlich schon, wie gesagt.

Nur: Sätze wie diese, kapier ich als Laie, aber sich selbst als halbwegs intelligent bezeichnend , einfach nicht:
Zitat:
Abstrakte Klassen haben aber noch einen etwas anderen Anwendungsfall. Hier können diverse Methoden als abstrakt definiert, aber auch konkret implementiert werden. Konkrete Klassen werden dann aber direkt über Vererbung implementiert, stellen aber nicht in dem Sinne bloß die Schnitstellendefinition der Klasse dar. Abstrakte Klassen können auch private Methoden enthalten, stellen also nahezu vollwertige Klassen dar mit dem Unterschied, dass diese nicht direkt abgeleitet werden können.
http://www.php.de/php-einsteiger/719...tml#post544008
echo ist offline  
Alt 22.11.2010, 11:56  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Mal angenommen du hast einen anderem Kontext: Dort weisst du über das übergebene Tier nur das es ein Tier ist. Dieses Tier willst du nun zum laufen bringen. Du machst also $tier->laufen(); . Die Methode laufen() muss also für jede beliebige Tierart vorhanden sein, funktioniert aber für jede Tierart intern unterschiedlich und es gibt keinen "Standardweg" den du direkt in die Tier-Klasse einbauen kannst. Machst du es wie in deinem Beispiel und implementierst in die Tier-Klasse eine Methode laufen() die z.B. einach false zurück liefert, dann ist derjenige der eine Tierart erschafft weder gezwungen die laufen()-Methode selbst zu implementieren noch weiss er überhaupt das das nötig ist und nicht bei allen gleich funktioniert. Ist die Methode laufen() jedoch Abstrakt, so weiss jeder Entwickler das er selbst definieren muss wie die Tierart zum laufen gebracht wird, er kommt überhaupt nicht drum rum es zu definieren.
cycap ist offline  
Alt 22.11.2010, 13:05  
Benutzer
 
Benutzerbild von echo
 
Registriert seit: 20.09.2008
Beiträge: 91
PHP-Kenntnisse:
Anfänger
echo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke cycap!

Kann mal also sagen:
  1. Man kann auch mit "normalen" Klassen alles erreichen, was man mit abstrakten Klassen erreicht
  2. Die einzigen zusätzlichen Funktionalitäten/Vorteile, die abstrakte Klassen bilden sind:
    1. Man kann Models besser strukturieren
    2. Gerade bei Projekten mit mehr als einem Entwickler sinnvoll
  3. Gerade, wenn man nur alleine für sich programmiert ohne dass andere Entwickler beteiligt sind, kann man durchaus auf abstrakte Klassen verzichten

Sorry, aber wie gesagt, ich will das endlich mal richtig schnallen - für Dummies halt!
echo ist offline  
Alt 22.11.2010, 13:18  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

3. Definitiv nicht! Stell dir vor du hast 30 Klassen um etwas zutun (Validatoren zum Beispiel) und diese haben alle die selbe Methode. Da wäre es sinnvoll eine abstrakte Klasse zu haben in der diese gemeinsame Methode enthalten ist und alle Validatoren erben dann von dieser abstrakten Klasse. Dies hat den Vorteil das du die Methode nur einmal Programmierst aber in 30 verschiedenen Klassen verfügbar ist.

Angenommen du würdest später merken das ein Bug in dieser Methode ist, dann müsstest du NUR in der abstrakten Klasse den Bug beheben, nicht in 30 verschiedenen Klassen.

Und nicht nur das ist ein Vorteil, auch kannst du z.b. Prüfen ob ein Objekt von einem bestimmten Typ ist, wird z.b. ein Validator Objekt an eine Methode übergeben könntest du OHNE abstrakte Klasse nur prüfen

if Objekt == Validator1 OR Objekt == Validator2 OR .... bis validator30

Wenn nun alle Validatoren von einer abstrakten Klasse erben könntest du einfach prüfen

if Objekt == ValidatorAbstrakt


Egal ob man alleine oder im Team arbeitet, abstrakte Klassen haben ihren Anwendungszweck und dort sollte man sie auch einsetzen!
Flor1an ist offline  
Alt 22.11.2010, 15:25  
Benutzer
 
Benutzerbild von echo
 
Registriert seit: 20.09.2008
Beiträge: 91
PHP-Kenntnisse:
Anfänger
echo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@Flor1an
ich versteh den Sinn vom Erstellen einer Elternklasse bzw. methode. Nur: ich hab's gerade ausprobiert: in meinem obigen Code-Beispiel kann ich auch in einer Kind-Klasse z.B. die Methode setBezeichnung($bez)
aus der Elternklasse "tier" jederzeit überschreiben. Dazu muss weder die Klasse "tier" noch die Methode setBezeichnung($bez) abstrakt sein.

Also, wozu "abstract" wenn eine Vererbung scheinbar auch "konkret" geht?
echo ist offline  
Alt 22.11.2010, 15:37  
Erfahrener Benutzer
 
Registriert seit: 23.09.2010
Beiträge: 146
PHP-Kenntnisse:
Fortgeschritten
jabubo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Abstract vor einer Methode sagt eigentlich nur aus, dass der Quellcode nicht in dieser Methode zu finden ist, sondern in der erbenden Klasse in exakt gleicher Weise implementiert werden MUSS, wie es durch den Methodenkopf definiert wird. Was genau in der Methode geschieht, ist Aufgabe der Klasse selbst. Somit ist es eine Vorschrift, die jede erbende Klasse erfüllen muss. Abstract bei der Klasse ist Pflicht sobald eine Methode abstract ist. Allerdings muss eine abstrakte Klasse keine abstrakte Methode enthalten.

Somit hilft dir die Abstrakte Klasse bzw. die Methode nur, wenn du mehrere Klassen von dieser ableiten willst. Im Beispiel aus Post 1 sollten die get und set Methoden abstrakt sein. Sofern ein Tier diese Methoden nicht implementiert, kommt es zu einem FATAL ERROR.

@Flor1an:
Diese Vorgehensweise reicht bei einer einfache Klasse aus. Abstract ist dafür nicht nötig.
__________________
PHP online testen, zum Beispiel: md5, base64_decode, preg_match, urldecode und viele weitere...
jabubo ist offline  
Alt 22.11.2010, 15:37  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Es kann keine Instanz einer abstrakten Klasse erzeugt werden. In deinem Beispiel möchtest du z.b. nur konkrete Tiere haben aber nie ein Objekt vom Typ "Tier" selbst. Wenn Tier also abstrakt ist kann es davon selbst keine Instanzen bzw. Objekte geben.

Desweiteren kann man Methoden leer lassen und diese als abstrakt Kennzeichnen. Somit MUSS die Kindklasse diese Methode implementieren, du kannst also mit der abstrakten Klasse alle Kindklassen dazu zwingen eine bestimmte Methode zu implementieren.
Flor1an ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Seite nur im Script aufrufbar BlackScorp PHP Tipps 2010 4 03.11.2010 15:57
[Erledigt] Klasse aus einer anderen Klasse aufrufen Tobby PHP-Fortgeschrittene 7 14.07.2010 20:05
[Erledigt] Nur einer bestimmten Klasse Zugriff andere Klasse erlauben Turamisi Software-Design 2 20.02.2010 20:31
Mysql Klasse macht Probleme in verschachtelten / verzweigten SQL Abfragen litterauspirna PHP Tipps 2010 3 16.02.2010 12:54
Klasse für Objekteigenschaft erzeugen? Asipak PHP-Fortgeschrittene 25 30.05.2009 19:45
[Erledigt] Eine klasse einbinden newWorldOrder PHP Tipps 2009 2 23.02.2009 19:32
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
Klasse aus externer Klasse aufrufen kostja PHP Tipps 2008 8 07.08.2008 14:13
UML - Abstrakte und vererbte Methoden zwingend anzugeben? MaMo-Net Off-Topic Diskussionen 3 17.03.2008 06:04
Variable aus Klasse herausbekommen GSJLink PHP Tipps 2008 7 16.02.2008 22:25
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
mehr als eine Klasse einbinden Alpha Centauri PHP-Fortgeschrittene 4 13.04.2006 20:56
Instanz einer Klasse in einer anderen Klasse verwenden Buhmann PHP-Fortgeschrittene 7 28.10.2005 23:12
[Erledigt] Brauche Hilfe bei meiner ersten Klasse PHP-Fortgeschrittene 9 24.09.2004 17:09
Klasse ändern UniQ PHP Tipps 2004 5 24.08.2004 14:46

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php abstrakte klasse erweitert abstrakte klassen, php abstrakte klassen, php abstrakte klasse, wozu abstrakte klassen, abstrakte klassen php, abstrakte klasse php, wofür abstrakte klassen, abstrakte klasse in php, wozu werden abstrakte klassen eingesetzt, abstrakte klassen wozu, abstrakte klasse, wozu abstrakte klasse, was ist eine abstrakte klasse, wozu braucht man abstrakte klassen, vorteile abstrakte klasse, wozu werden abstrakte klassen benötigt?, php abstracte klasen, vorteil abstrakte klasse, abstrakte klasse wozu, getarte tiere

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:19 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum