php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.12.2011, 14:01  
Benutzer
 
Registriert seit: 12.11.2009
Beiträge: 90
PHP-Kenntnisse:
Fortgeschritten
PiXeL1337 befindet sich auf einem aufstrebenden Ast
Standard

@Asterixus

Ich würde wenn ich Methoden o.ä unbedingt haben will interfaces nehmen. Wenn ich vorhandene Methoden vererbe abstrakte Klassen.

PHP-Code:
interface Data
{
    public function 
getPS();    
}
interface 
ModifyData
{
    public function 
editPS();    
}

abstract class 
Auto
{
    protected 
$ps;
}

class 
Audi extends Auto implements DataModifyData
{    

__________________
PiXeL1337 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 27.12.2011, 14:21  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von meikel Beitrag anzeigen
abstract nutze ich ab und zu, damit ich mir das Tippern allgemeiner Methoden sparen kann. Allerdings ist mir noch kein zwingender Grund eingefallen, interface nutzen zu müssen.
Eine Klasse kann ihre Schnittstelle von mehreren Interfaces erben, was mit einer abstrakten Klasse nicht geht. Bevor Traits erfunden wurden, hatte PHP nur diese (von Java kopierte) Krücke.

Außerdem stellen Interfaces in PHP die einzige Möglichkeit dar, eine Typprüfung zur "Übersetzungszeit" und nicht erst zur Laufzeit durchzuführen, also eine Art "statische Typisierung" zu simulieren.

Geändert von fireweasel (27.12.2011 um 14:47 Uhr). Grund: typo
fireweasel ist offline   Mit Zitat antworten
Alt 27.12.2011, 14:21  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Interfaces sind schlichtweg Angaben, wie eine nicht näher benannte Klasse auszusehen hat. Wenn eine Methode beispielsweise als Parameter ein Objekt bekommt, so möchtest du ja sicherstellen, dass das Objekt die Methoden anbietet, die du benötigst.

PHP-Code:
public function machWas($obj) {
    
$bar $obj->gibMirFoo();

In diesem Beispiel kann es zu Problemen kommen, falls $obj die methode "gibMirFoo" gar nicht bereitstellt. Du kannst aber eine Schnittstelle definieren, die "gibMirFoo" vorsieht. Im Methodenkopf musst du nur noch sagen, dass es dir quasi egal ist, was du bekommst, wenn es doch nur die Schnittstelle implementiert, die du benötigst.
PHP-Code:
public function machWas(FooVerarbeiter $obj) {
    
// FooVerarbeiter ist das Interface, das $obj haben muss
    
$bar $obj->gibMirFoo();

Abstrakte Klassen sind dafür gedacht, eine Art "Vorkonfiguration" für Kindsklassen bereitzustellen. Angenommen, du hast die Klassen VWGolf, VWPassat, AudiA8 etc. Alle diese Klassen sollen etwa die Methode "starteMotor()" besitzen, dessen Methodeninhalt häufig gleich ist. Für so etwas kannst du eine abstrakte Klasse nutzen.

PHP-Code:
abstract class PKW {
   protected 
$motorLaeuft false;

   public function 
starteMotor() {
      
$this->steckeSchluesselReinUndDrehe();
      
$this->motorLaeuft true;
   }
   
   public function 
steckeSchluesselReinUndDrehe() {
      
// ....
   
}
}

class 
VWGolf extends PKW {
   
// keine Implementation von starteMotor notwendig, da vorkonfiguriert
}

class 
HondaCivic extends PKW {
    public function 
starteMotor() {
         
// andere Implementation, überschreiben der Methode ist möglich
         
$this->drueckeEngineStartKnopf();
         
$this->motorLaeuft true;
    }

__________________
dsentker ist offline   Mit Zitat antworten
Alt 27.12.2011, 14:41  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 300
PHP-Kenntnisse:
Fortgeschritten
Asterixus sorgt für eine eindrucksvolle AtmosphäreAsterixus sorgt für eine eindrucksvolle Atmosphäre
Asterixus eine Nachricht über Skype™ schicken
Standard

Da hast du aber ein wichtiges Konzept von abstrakten Klassen nicht beachtet: Denn es gibt die Möglichkeit abstrakte Methoden einzufügen, die die Implementierung in Kindsklassen erzwingen.

@PiXeL1337: Dieses Beispiel ist meiner Meinung nach schlecht. Warum müsste man getPS() und setPS() in einer nicht abstrakten Klasse erst implementieren? Außerdem verstehe ich nicht, warum du nicht abstract function getPS(); in PKW?
Asterixus ist offline   Mit Zitat antworten
Alt 27.12.2011, 14:43  
Erfahrener Benutzer
 
Registriert seit: 26.11.2008
Beiträge: 264
dsentker befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Asterixus Beitrag anzeigen
Da hast du aber ein wichtiges Konzept von abstrakten Klassen nicht beachtet: Denn es gibt die Möglichkeit abstrakte Methoden einzufügen, die die Implementierung in Kindsklassen erzwingen.
Na und? Es war nicht Teil meines Beispiels.
__________________
dsentker ist offline   Mit Zitat antworten
Alt 27.12.2011, 14:45  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 300
PHP-Kenntnisse:
Fortgeschritten
Asterixus sorgt für eine eindrucksvolle AtmosphäreAsterixus sorgt für eine eindrucksvolle Atmosphäre
Asterixus eine Nachricht über Skype™ schicken
Standard

Abstrakte Methoden sprechen aber gegen ein Vorkonfiguration, oder nicht? Und inwiefern nicht?
Asterixus ist offline   Mit Zitat antworten
Alt 27.12.2011, 14:48  
Erfahrener Benutzer
 
Benutzerbild von litterauspirna
 
Registriert seit: 24.04.2008
Beiträge: 3.172
PHP-Kenntnisse:
Anfänger
litterauspirna sorgt für eine eindrucksvolle Atmosphärelitterauspirna sorgt für eine eindrucksvolle Atmosphäre
litterauspirna eine Nachricht über ICQ schicken
Standard

Beide haben ihre begründeten und gerechtfertigten Einsatzgebiete. Es kommt auf meine / deine Anforderung darauf an was du machen willst.

Ein Interface nimmst du wenn du gegen eine Schneittstelle programmieren willst. Somit kannst du es eben auch vermeiden gegen konkrete Klassen zu programmieren sondern gegen Interfaces. Mit dem Interface schreibst du also nicht nur vor wie die Klasse die das Interface implementiert auszusehen hat, sondern du sicherst somit auch das Methoden die du brauchst und zur Verfügung stehen.

Eine Abstrakte Klasse benutzt du wenn du mehrere spezielle Objekte von dieser Klasse ableiten willst und in dieser Abstrakten Klasse stellst du einfach Funktionialität zur Verfügung die du in allen abgeleiteten Objekten benötigst.

Auch wenn ich bei abstrakten Klassen über abstrakte Methoden festlegen kann das diese Methode in der erbenden Klasse definiert wird hat das noch lange nichts gleich mit dem Sinn des Interfaces.

Ziemlich deutlich wird das dann bei den Design Patterns, z.B. das Strategy Pattern.

Gruß Litter
__________________
Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
http://www.lit-web.de
litterauspirna ist offline   Mit Zitat antworten
Antwort


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
[Erledigt] Fehlermeldung Methodensignatur abstrakte Klasse nedelin PHP-Fortgeschrittene 10 16.11.2011 22:25
Klassendesign/Klassenobjekt an andere Klasse übergeben pikachu PHP-Fortgeschrittene 2 29.08.2011 19:37
Wozu brauche ich eigentlich eine abstrakte Klasse? echo PHP Tipps 2010 28 24.11.2010 17:10
Interface in Klasse richtig benutzen, Strategie Pattern litterauspirna PHP Tipps 2010 4 24.11.2010 13:59
Seite nur im Script aufrufbar BlackScorp PHP Tipps 2010 4 03.11.2010 15:57
[Erledigt] Interface vs. Abstract MaxC PHP Tipps 2010 9 18.09.2010 02:38
Von Klasse ableiten UND Interface implementieren? xm22 Software-Design 7 11.08.2010 14:46
[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
abstrakte Klassen und Interfaces Chriz PHP-Fortgeschrittene 17 16.11.2009 16:09
Klasse für Objekteigenschaft erzeugen? Asipak PHP-Fortgeschrittene 25 30.05.2009 19:45
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
strategy pattern interface oder abstrakte klasse

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:40 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