php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 10.06.2009, 09:15  
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 Sinn und Zweck abstracter klassen und interfaces

Hallo Gemeinde,

mal wieder habe ich eine Verständnis bzw. Sinnfrage. Ich ahbe nun, da ich nebenbei auch in Java und C++ rein lerne über abtracte Klassen sowie Interfaces gelesen. Den Unterschied zwischen beiden weis ich mittlerweile.

In Interfaces werden nur Methoden vordeklariert die aber in einer Klasse wo dieses Interface implementiert wird auch unbedingt angewendet werden müssen bzw. überschrieben werden müssen.

In abtracten Klassen kann kompletten Handlungscode und Programmabläufe schreiben und diese dann in eine andere Klasse mit extends einbinden.

So meine Frage nun dazu ist, was für einen Sinn machen beide Sachen? Wann und wie und warum mit welchen Vorteil werden die eingesetzt? Ich konnte über meine gestellten Fragen leider keine Antwort finden oder habe mich bei der Suche danach nur dumm angestellt.

Auch zu den Exceptions noch mal eine Frage, was die bedeutet weis ich, aber schreibt man dafür eine extra Klasse die alle eventuellen Fehlerauftritte abhandelt und diese dann abfängt oder wie würde das konkret ablaufen?

Ich danke vilmals für eure Antworten 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  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 10.06.2009, 10:23  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

Ich versuchs mal von meinem Verständnis her:

Ein interface zeigt dir, welche public Methoden eine Klasse dieser Art haben muß.
Damit gibst du einen Rahmen vor, an den sich abgeleitete Klassen in dem Bereich halten müssen.

Eine abstrakte Klasse mit abstrakten Methoden dient (zumindest bei php) mehr oder weniger dem gleichen Zweck. Im Unterschied zu interfaces kannst du allerdings zwischen public und protected unterscheiden.
Abstrakte Methoden geben dann wie im Interface die Methoden vor, die in der Kindklasse vorhanden sein müssen. Zusätzlich dazu kannst du noch nicht abstrakte Methoden vorgeben, die du vererben willst.

zu den exceptions: Entweder man erweitert die von php mitgelieferte Exception klasse oder benutzt die system-eigene.
In kleineren Projekten habe ich bisher immer nur eine Kindklasse definiert, die sich um alle Fehler kümmert (error codes, logging).
Z.b. im Zend- Framework besitzt widerum jede Komponente eine eigene Fehler- Klasse. Einfach, um spezifischer reagieren zu können.

Gruß
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline  
Alt 10.06.2009, 14:22  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Der grösste Vorteil von Interfaces liegt imho im Entwurfsstadium. Du schreibst etwas und weisst genau, dort wird später mal ein Objekt sitzen, welches das und das tut. Du weisst noch nicht, wie genau dieses Objekt arbeitet (Blackboxprinzip), aber Du weisst welche Ein- und Ausgaben es verarbeitet und definierst über die Schnittstelle, wie es angesprochen werden soll.
2. Ein verwandter Vorteil: Du setzt ein modulares Konzept um, in dem Objekte austauschbar sein sollen. Mit einem Interface lieferst Du eine Schablone, wie die Blackbox des austauschbaren Objektes aussieht - egal wie es später was verarbeitet, oder was sich jemand mal für diesen Bereich ausdenkt, er hat einen konkreten Anhaltspunkt, wie sein Objekt nach aussen interagieren muss.
3. In Frameworks sind Abhängigkeiten oft nicht ganz auszuschliessen. So übergibt man bspw. einem Objekt ein anderes als Datenspeicher. Wenn man bei der Übergabe ein konkretes Interface vorgibt, wird zumindest die alles bis auf die Schnittstelle unabhängig, da bereits das Interface das Vorhandensein bestimmter Zugriffsmethoden erzwingt.

Mein kleiner Erklärungsansatz.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 11.06.2009, 13:51  
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

Das mit den Interfaces habe ich vom Sinn her soweit begriffen, eine Frage noch dazu, ist es Sinvoll das ein Interface für mehrere unterschiedliche Klassen eine Schnittstelle bietet? Oder aäre das eher Zweckentfremdet und man sollt für eine bestimmte Klasse ein zugehöriges Interface machen?

Meine Frage zum Sinn und -zweck zu abstracten Klassen ist irgendwie noch ungeklärt. Wie gesagt was eine abstracte Klasse nicht kann weis, das heist man kann ein Objekt einer abstracten Klasse nicht instanzieren. Aber wosu machen solche Klassen eben einen Sinn, das will mir nicht wirklich einleuchten. Habe in anderen Foren eben nur gelesen was eine abstracte Klasse und was man damit nicht machen kann, aber den Sinn einer solchen haben ich noch nicht nachlesen können.

Habt vielen Dank für eure Erklärungen 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  
Alt 11.06.2009, 14:31  
yab
Erfahrener Benutzer
 
Registriert seit: 05.04.2009
Beiträge: 291
PHP-Kenntnisse:
Anfänger
yab befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von litterauspirna Beitrag anzeigen
Das mit den Interfaces habe ich vom Sinn her soweit begriffen, eine Frage noch dazu, ist es Sinvoll das ein Interface für mehrere unterschiedliche Klassen eine Schnittstelle bietet?
Es macht eigentlich erst dann richtig Sinn, wenn mehrere Klassen dieses Interface implementieren.
Beispiel:
Du definierst ein Interface DbAdapter mit der Methode connect(array $params). Für einen MySQL-DBAdapter verwendest du in der konkreten Implementierung mysql_connect(), für einen MS-SQL-Adapter benutzt du darin mssql_connect() ... usw.
Das Interface garantiert dir also das Vorhandensein der connect-Methode, die konkrete Implementierung befindet sich in der jeweiligen Adapter-Klasse.

Zitat:
Zitat von litterauspirna Beitrag anzeigen
Meine Frage zum Sinn und -zweck zu abstracten Klassen ist irgendwie noch ungeklärt.
...
Habe in anderen Foren eben nur gelesen was eine abstracte Klasse und was man damit nicht machen kann, aber den Sinn einer solchen haben ich noch nicht nachlesen können.
Eine abstrakte Klasse ist eine Erweiterung eines Interfaces. Sie kann neben abstrakten Methoden auch bereits implementierte Methoden besitzen. Für das obige Beispiel könnte das vielleicht eine logSQL($Sql)-Methode sein, die alle SQL-Statements in eine Log-Datei schreibt. Diese Methode ist für alle DB-Adapter-Klassen gleich, kann also einmalig bereits in der abstrakten Klasse vollständig impelementiert werden.

Nachteil an der Sache ist, das PHP keine Mehrfachvererbung unterstützt und du dich so bereits auf eine Elternklasse festgelegt hast.
yab ist offline  
Alt 11.06.2009, 14:44  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Zitat:
Zitat von litterauspirna Beitrag anzeigen
Das mit den Interfaces habe ich vom Sinn her soweit begriffen, eine Frage noch dazu, ist es Sinvoll das ein Interface für mehrere unterschiedliche Klassen eine Schnittstelle bietet? Oder aäre das eher Zweckentfremdet und man sollt für eine bestimmte Klasse ein zugehöriges Interface machen?
Nicht für jede Klasse macht ein Interface Sinn, Interfaces machen dann Sinn wenn man z.b. eine Klasse (Klasse A) hat die eine andere nutzt (Klasse B) und man in Zukunft plant alternativen zu Klasse B zu schreiben.

Man betrachte diesen Code
PHP-Code:
<?php

Class A
{
    public function 
doSomething(B $b)
    {
        if(
$b->valid($))
        {
            
// do something
        
} else {
            
// do something else
        
}
    }
}

class 
B
{
    protected 
$_val 0;
    public function 
__construct($val)
    {
        
$this->_val $val;
    }
    
    
/**
     * @return bool
     **/
    
public function valid()
    {
        if (
$this->_val->count() > 0) {
             return 
true;
        } else {
            return 
false;
        }
    }
Irgendwann braucht man dann vielleicht irgendwo anders eine Klasse die ähnlich Klasse B ist, aber wo die überprüfung in valid() anders implementiert ist, dann lohnt es sich für die Klasse B ein Interface zu nutzen:

PHP-Code:
<?php

Class A
{
    public function 
doSomething(BInterface $b)
    {
        if(
$b->valid())
        {
            
// do something
        
} else {
            
// do something else
        
}
    }
}

Interface 
BInterface
{
    public function 
valid();
}

class 
implements BInterface
{
    protected 
$_val 0;
    public function 
__construct($val)
    {
        
$this->_val $val;
    }
    
    
/**
     * @return bool
     **/
    
public function valid()
    {
        if (
$this->_val->count() > 0) {
             return 
true;
        } else {
            return 
false;
        }
    }
}

class 
implements BInterface
{
    protected 
$_val 0;
    public function 
__construct($val)
    {
        
$this->_val $val;
    }
    
    
/**
     * @return bool
     **/
    
public function valid()
    {
        if (
$this->_val->isConnected()) {
             return 
true;
        } else {
            return 
false;
        }
    }
}
Jetzt kann man Problemlos noch weitere Klassen das Interface BInterface implementieren lassen und für die Überprüfung nutzen.

Zitat:
Meine Frage zum Sinn und -zweck zu abstracten Klassen ist irgendwie noch ungeklärt. Wie gesagt was eine abstracte Klasse nicht kann weis, das heist man kann ein Objekt einer abstracten Klasse nicht instanzieren. Aber wosu machen solche Klassen eben einen Sinn, das will mir nicht wirklich einleuchten. Habe in anderen Foren eben nur gelesen was eine abstracte Klasse und was man damit nicht machen kann, aber den Sinn einer solchen haben ich noch nicht nachlesen können.

Habt vielen Dank für eure Erklärungen gruß litter
Bei einer abstrakten Klasse ist es so, dass man mehr als nur die Schnittstelle anbieten will (z.b. schon fertige Getter und Setter) oder dass man z.b. ein Interface nutzt, das aber nicht komplett implementiert:


Im nächste Code-Beispiel haben wir ein Interface ( CanDoSomethingInterface ), eine Abstrakte Klasse die teile davon implementiert ( CanDoSomethingAbstract ), 2 Klassen die dann auf die Abstrake Klasse aufbauen ( ReallyDoesSomethingByInstantMessanger, ReallyDoesSomethingByMail) und eine Klasse ( AnotherClass ) die wiederum wie aus dem oberen Beispiel mit den Interfaces, eine Methode (handleCanDo) bietet der man eine Klasse die ein Interface implementiert übergeben kann und die etwas damit macht.
PHP-Code:
<?php
Interface CanDoSomethingInterface
{
    public function 
getFoo();

    public function 
setFoo($foo);
    
    
/**
     * @return bool
     **/
    
public function isValidFoo();

    public function 
doSomething();
}

abstract Class 
CanDoSomethingAbstract implements CanDoSomethingInterface
{
    public function 
getFoo()
    {
        return 
$this->_foo;
    }
    
    public function 
setFoo($foo)
    {
         if (
$foo !== null) {
            
$this->_foo $foo;
         } else {
             throw new 
Exception('$foo is null');
         }
    }
    
    public function 
isValidFoo()
    {
        if(
$this->getFoo()->hasSomething())
        {
            return 
true;
        } else {
            return 
false;
        }
    }
    
// nicht implementierte Methoden des Interfaces als abstract deklarieren
    
abstract public function doSomething();

    abstract public function 
doSomethingElse();
}

Class 
ReallyDoesSomethingByMail extends CanDoSomethingAbstract
{

    public function 
doSomething()
    {
        if (
$this->isValidFoo()) {
            
$mail = new Mail();
            
$mail->setBody($this->getFoo()->__toString());
        } else {
            throw new 
Exception("Invalid Foo");
        }
    }
}


Class 
ReallyDoesSomethingByInstantMessanger extends CanDoSomethingAbstract
{
    public function 
doSomething()
    {
        if (
$this->isValidFoo()) {
            
$messenger = new InstantMessenger();
            
$messenger->setMessage($this->getFoo()->__toString());
            
$messenger->send();
        } else {
            throw new 
Exception("Invalid Foo");
        }
    }        
}


Class 
AnotherClass
{
    public function 
__construct(CanDoSomethingInterface $canDo)
    {
        
$canDo->doSomething();
    }
}
Und an alle anderen die das lesen, ja ich weis, man hätte auch anstatt Messenger und Mail hier einen Adapter nutzen können der der Klasse übergeben wird und sich so den ganzen kram sparen, aber ich denke (hoffe) fürs grundlegende Verständnis von abstrakten Klassen kann das Beispiel trotz der konfusen Klassen, Interface und Methodennamen helfen
robo47 ist offline  
Alt 11.06.2009, 18:00  
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

Habt mal alle vielen Dank für eure Antworten, zumindest ist mir jetzt auch einiges klarer fürs Verständnis geworden.

Den Code von robo muss ich zwar erst mal richtig in de Rübe bekommen und den verstehen, werde mir aber Mühe geben.

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  
Alt 12.06.2009, 23:50  
Erfahrener Benutzer
 
Benutzerbild von tomtaz
 
Registriert seit: 17.06.2008
Beiträge: 1.762
PHP-Kenntnisse:
Fortgeschritten
tomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig netttomtaz ist einfach richtig nett
tomtaz eine Nachricht über ICQ schicken tomtaz eine Nachricht über Skype™ schicken
Standard

Ich meine, ich kann mich jetzt gewaltig irren, aber müssen als Abstract deklarierte Funktionen in den Kinderklassen nicht auch deklariert werden?

Demnach würde ReallyDoesSomethingByMail und ReallyDoesSomethingByInstantMessanger jeweils eine Fehlermeldung, der nicht deklarierten Funktion doSomethingElse die in der Abstakten Klasse als abstract deklariert wurde, werfen?

Müsste ich jetzt mal testen, aber ich meine das ich da richtig liege.

Edit: Jap, müssen deklariert werden:
Zuvor passt dem deine nicht definierte Methode des Interfaces schon nicht:
Zitat:
Fatal error: Can't inherit abstract function CanDoSomethingInterface::doSomething() (previously declared abstract in CanDoSomethingAbstract) in \htdocs\php.php on line 35
kommentiert man die aus (im Interface) so kommt wie vermutet, dass hier

Zitat:
Fatal error: Class ReallyDoesSomethingByMail contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (CanDoSomethingAbstract::doSomethingElse) in \htdocs\php.php on line 66
__________________
Mfg Tomtaz
"Es soll jetzt diese Erfindung geben.... Kugel oder so heißt die. Ist so eine Art Suchmaschine..."

Geändert von tomtaz (12.06.2009 um 23:55 Uhr).
tomtaz ist offline  
Alt 13.06.2009, 00:14  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

Zitat:
Zitat von tomtaz Beitrag anzeigen
Ich meine, ich kann mich jetzt gewaltig irren, aber müssen als Abstract deklarierte Funktionen in den Kinderklassen nicht auch deklariert werden?

Demnach würde ReallyDoesSomethingByMail und ReallyDoesSomethingByInstantMessanger jeweils eine Fehlermeldung, der nicht deklarierten Funktion doSomethingElse die in der Abstakten Klasse als abstract deklariert wurde, werfen?

Müsste ich jetzt mal testen, aber ich meine das ich da richtig liege.

Edit: Jap, müssen deklariert werden:
Zuvor passt dem deine nicht definierte Methode des Interfaces schon nicht:


kommentiert man die aus (im Interface) so kommt wie vermutet, dass hier
Ups ja :P da hatte ich eine methode zu viel drin gelassen :P

//edit

damn .. kann es nimmer selbst editieren ... egal ... die methode einfach wegdenken
robo47 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
Mehrere Klassen verknüpfen BlackJack01090 Software-Design 9 26.05.2009 20:43
[Erledigt] Der Sinn und Zweck von Anonymen Funktionen? DarkPrisma PHP-Fortgeschrittene 16 23.04.2009 14:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sinn von interfaces, interface sinn, interface zweck, interfaces sinn, sinn von interface, php interfaces sinn, zweck interface, sinn und zweck von interfaces, php sinn von interface, php interface sinn, sinn interfaces, zweck von interfaces, php unterschied abstract interface, sinn interface, zweck abstrakter klassen, php interfaces, php abstract \sinn\, unterschied abstract interface php, c interface andere interfaces vorgeben, sinn von interfaces php

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