php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.11.2010, 08:44  
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 Abstrakte Methoden

Zitat:
Ist eine Methoden abstrakt so muss sie in der Kindklassen definiert werden.
..wurde tw. verneint.

PHP-Code:
<?php
abstract class tier{

  abstract public function 
foo();

  public function 
bar(){
    
//
  
}

}

class 
fisch extends tier{

  public function 
baz(){
    
//
  
}
  
}

$fisch = new fisch();
====>
Zitat:
Fatal error: Class fisch contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (tier::foo)
auch
PHP-Code:
class fisch extends tier{
abstract public function 
foo();
  public function 
baz(){
    
//
  
}
  

feuert einen Fatal error.

Nur:
PHP-Code:
<?php
abstract class tier{

  abstract public function 
foo();

  public function 
bar(){
    
//
  
}

}

class 
fisch extends tier{
public function 
foo(){}
  public function 
baz(){
    
//
  
}
  
}

$fisch = new fisch();
funktioniert!

Ergo: Abstrakte Methoden in abstrakten Klassen müssen in Kind-Klassen definiert werden, oder??

Zum Thema Zwang: De facto ist es schon ein Zwang. Aber positiv betrachtet (siehe auch mermshaus Post) hilft es einfach nur dem Programmierer, nix zu vergeßen.
echo ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 23.11.2010, 09:30  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.733
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Zitat:
Zitat von mermshaus
Eine Klasse, die eine nicht realisierte abstrakte Methode enthält, ist immer insgesamt abstrakt.
Du kannst deine schöne Vererbungshierarchie nur dann instanziieren, wenn du schließlich eine Klasse hast, in der sämtliche abstrakten Methoden implementiert vorliegen.

Bitte die Doku dazu lesen:

- http://php.net/manual/en/language.oop5.abstract.php

(Edit: Hm, die könnte an der Stelle ausführlicher sein…)

PHP-Code:
abstract class lebewesen
{
    abstract public function 
foo();
}

abstract class 
tier extends lebewesen
{
    abstract public function 
bar();

    public function 
baz() {}
}

class 
fisch extends tier
{
    public function 
foo() {}
    public function 
bar() {}
}

$fisch = new fisch(); 
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (23.11.2010 um 09:35 Uhr).
mermshaus ist offline  
Alt 23.11.2010, 09:40  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 724
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von echo Beitrag anzeigen
Ergo: Abstrakte Methoden in abstrakten Klassen müssen in Kind-Klassen definiert werden, oder??
Letztendlich ja, meine "kleinlichen" Vorposter meinten soetwas:
PHP-Code:
abstract class tier
{
  abstract public function 
foo();
}

abstract class 
fisch extends tier
{  
}

class 
barsch extends fisch

    public function 
foo()
    {        
    }
}

$barsch = new barsch(); 
Die ebenfalls abstrakte Kindklasse "fisch" implementiert nicht die Methode "foo". Erst in der nächsten Vererbungsstufe wird die Methode implementiert.
hts ist offline  
Alt 23.11.2010, 10:11  
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

@hts
Danke, jetz kapier ich.

Ja, man nuss da echt total umdenken, wenn man 1.Laie ist und 2.die ganze Zeit nur mit Spaghetti-Code herum gemacht hat.
echo ist offline  
Alt 23.11.2010, 11:15  
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

Meiner Meinung nach ist "die Methode muss existieren" und "die Methode ist definiert" das selbe.
Flor1an ist offline  
Alt 23.11.2010, 11:26  
Neuer Benutzer
 
Registriert seit: 03.11.2010
Beiträge: 17
PHP-Kenntnisse:
Anfänger
Altrea befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von litterauspirna Beitrag anzeigen
...in abstrakten Klassen hast du aber auch die Möglichkeit sie auf protected und private zu setzen...
Ich bin mir gerade nicht ganz sicher, aber private dürfte nicht funktionieren.
Altrea ist offline  
Alt 23.11.2010, 13:02  
Erfahrener Benutzer
 
Benutzerbild von splasch
 
Registriert seit: 05.01.2009
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
splasch kann nur auf Besserung hoffen
Standard

Mit einer abstracten Methode hast du die Möglichkeit sicherzustellen das alle das ein und selbe Objekt , Variable verwenden nicht verwechseln mit dem Singlton.

So ist möglich das man über die Abstracte mehre Objekte verwalten kann und damit auch Kontrollieren das nur erlaubte sachen durchgeführt werden können. Kurz gesagt man baut sich ein Schutz system auf das verhindert das man unbeabsichtig laufzeitfehler miteinbaut.

Hier mal ein Beispiel was ich vor langen mal geschrieben habe. (Verwaltet mehre Objekte)

PHP-Code:
<?php
/**
* Abstrace Gruppen 
* @version 1.2
* @author Splasch
* @Filename: absgruppen.php
* Benutzer Verwaltung
**/ 
if (version_compare(PHP_VERSION'5'))
{
    die(
'Dieses File wurde generiert für PHP 5');
}
abstract class 
Absgruppen
{
    private 
$gruppen = array(); # Gruppen Objekte 
    
private $allName = array(); # Namen aller Instanzierten Gruppen
/**
* Neue Gruppe den User hinzufügen
* @param $gruppe Objekt 
* @param $name String
* @return void
*/
abstract public function addGruppe(Gruppe $gruppe,$name); 
/**
* Neues Objekt der Gruppe in Array Speichern und den Gruppen Namen
* @param $gruppe Objekt 
* @param $name String
* @return void
* Nur hinzufügen wenn das Objekt noch nicht vorhanden ist
*/
function setGruppe(Gruppe $gruppe,$name)
{
 if(
is_object($this->gruppen[$name]))
    {
        echo 
"Gruppe <b>".$name."</b> schon drin.<br>";
  return;
 }
 
$this->gruppen[$name]=$gruppe;
 
$this->allName[]=$name;
}
/**
* Gibt das Angeforderte Gruppen Objekt zurück
* @param $index String
* @return gruppen Objekt
*/
function gibGruppe($index)
{
    return 
$this->gruppen[$index];
}
/**
* Gibt die Namen Aller Gruppen zurück
* @param 
* @return array
*/
function gibGrupNames()
{
    return 
$this->allName;
}
}
?>
Wie du hier sieht können auch Abstracte Klassen eigene Methoden beinhalten. Du kannst aber nie aus einer Abstracten Klasse direkt ein Objekt erstellen. Dies ist nur über die erbenden Klassen von der abstracten Klasse möglich.

Wie diese Klasse zum Beispiel
PHP-Code:
<?php
/**
* User
* @version 1.4
* @author Splasch
* @Filename: user.php
* Benutzer Verwaltung
**/ 
if (version_compare(PHP_VERSION'5'))
{
    die(
'Dieses File wurde generiert für PHP 5');
}
class 
User extends Absgruppen 
{
    protected 
$user_id 0;       # Benutzer Nummer
    
protected $user_name '';    # Benutzer Name
    
protected $user_mail '';    # E-Mail Adresse 
/**
* User Profil Eigenschaften füllen
* @param $profil array
* @return null
*/
public function __construct($profil)
{
    if(
is_array($profil))
    {
        
$this->user_id=$profil['id'];
        
$this->user_name=$profil['name'];
        
$this->user_mail=$profil['mail'];
    }
    return 
false
}
/**
* Neue Gruppe den User hinzufügen
* @param $gruppe Objekt 
* @param $name String
* @return void
*/
public function addGruppe(Gruppe $gruppe,$name)
{
    
$this->setGruppe($gruppe,$name);
}
/**
* Gibt das Angeforderte Gruppen Objekt zurück
* @param $index String
* @return gruppen Objekt
*/
public function getGruppen($index)
{
    return 
$this->gibGruppe($index);
}
/**
* Gibt die Namen Aller Gruppen zurück
* @param 
* @return array
*/
public function getGrupNames()
{
    return 
$this->gibGrupNames();
}
/* end of class User */
?>
Dadurch hat man eine Vorlage geschaffen an die sich die anderen erbende Klassen halten müssen. Dadurch wird eben verhindert das man umbewußt laufzeitfehler mit einbaut. Da alles Zentrall von einer stelle aus gerregelt wird.

Du kannst also nicht von auserhalb auf die Interne Objekte zugreiffen. Den direkt zugriffe auf abstrace Klassen sind nicht möglich.

Mfg Splasch

Geändert von splasch (23.11.2010 um 13:19 Uhr).
splasch ist offline  
Alt 24.11.2010, 15:47  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.733
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Zitat:
Mit einer abstracten Methode hast du die Möglichkeit sicherzustellen das alle das ein und selbe Objekt , Variable verwenden nicht verwechseln mit dem Singlton.
Glaube, die Gefahr ist eher gering. Ich weiß nicht, wie du das genau meinst, aber „das alle das ein und selbe Objekt , Variable verwenden“, ist so definitiv nicht richtig.

Zitat:
So ist möglich das man über die Abstracte mehre Objekte verwalten kann und damit auch Kontrollieren das nur erlaubte sachen durchgeführt werden können. Kurz gesagt man baut sich ein Schutz system auf das verhindert das man unbeabsichtig laufzeitfehler miteinbaut.
Das ist relativ richtig, wenn du damit Type-Hinting umschreiben möchtest. Das ist allerdings keine besondere Eigenschaft abstrakter Klassen. Kindklassen können zudem die Methoden der Elternklasse überschreiben. (Ich habe einen gewissen Verdacht, dass es darum gehen könnte.)

Zu dem Code selbst fällt mir nicht viel ein. Aber „User extends Gruppe“ finde ich fragwürdig.
__________________
Blog | Buch | Kaloa
mermshaus ist offline  
Alt 24.11.2010, 17:10  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.990
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

Zitat:
Naja nicht so direkt, abstrakte Klassen zwingen den Programmierer zu gar nichts, sie bieten ihm nur eine ideale Schnittstelle die sie in vielen Klassen verwenden können.
Stimmt nicht. Solange man das zugrundeliegende Pattern nutzen will (also die Basisklasse oder aber eine Klasse, die bspw. ein Objekt des abstrakten Typs komponiert), ist man de facto gezwungen, das Interface zu bedienen.
Zitat:
Ist eine Methoden abstrakt so muss sie in der Kindklassen definiert werden.
Zitat:
Nein sie muss nicht definiert werden, sie muss einfach nur aufgeführt werden.
Stimmt nicht. Sie muß definiert werden oder darf nicht aufegführt sein! Siehe obige Ausführungen zum Thema abstract erbt von abstract.

Sinnvoll für den Einsteiger ist machmal vielleicht, rückwärts zu denken.
1. Welche konkreten Objekte brauche ich
2. Welche Gemeinsamkeiten (funktional, also Methoden, und semantisch also bspw, alles Tiere, Säugetiere ...) haben diese Objekte. Hieraus erstellen wir Elternklassen
3. Welche diese Elternklassen sind überhaupt noch eigenständige Objekte? Definieren manche nur noch bestimmte Helper oder eine funktionale Basis, ohne selbständig lauffähig zu sein? Sind sie semantisch abstrakt, also eben „Tier“, mit dem der „Bauer“ als Begriff nichts anfangen kann? -> als abstrakt deklarieren (muss dabei nicht zwingend abstrakte Methoden fordern/definieren)
4. Objektverknüpfungen. Werden diese Objekte in anderen verwendet? Reichen die bisher herausgebildeten abstrakten Klassen, um die erwarteten Objekte zu charakterisieren?
4a. Wenn ja: die abstrakte Klasse als Type Hint verwenden, die alle erwarteten Objekte charakterisiert (das muss nicht die allgemeinste Klasse in der konkreten Klassenhierarchie sein!)
4b. Wenn nicht: werden nur bestimmte Verhalten des Objekts erwartet (nicht aber ein semantischer Kontext), ist es vielleicht sinnvoll, zusätzlich ein Interface zu definieren, das nur (!) die Methoden definiert, das der jeweilige Kontext von allen gültigen Parameter-Objekten benötigt. Da man mehrere Interfaces implementieren kann, ist es möglich, hier Teil-Schnittstellen zu definieren, bspw. render() für ein anzeigbares Objekt oder die klassischen Schnittstellen für ArrayAccess oder Traversable.
4bff. Hinterher kontrollieren, ob das Interface die abstrakten Methoden besser repräsentiert, als die vorher verwendete abstrakte Basisklasse. Evtl. entspr. Methoden aus der abstrakten Klasse herausnehmen und statt dessen das Interface implementieren.
__________________
--
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  
 


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
\wozu werden abstrakte klassen benötigt\, wozu werden abstrakte klassen benötigt, abstracte class, php abstrakte klasse extends abstrakte klasse, wozu werden abstrakte klassen benötigt?, wofür brauche ich arrays, \wozu benötigt man abstrakte klassen?\, classfisch, wofür type hints php, abstract methode brauche ich ein object, abstrakte klasse haustiere, wozu braucht man abstrakte klassen, \wozu benötigt man abstrakte klassent\, wozu braucht man abstrakte klassen?, abstrakte klasse privat, was ist das besondere an abstrakten klassen, php abstrakte klasse, php type hint kindsklassen, php abstrakte methode füllen, wozu brauche ich search helper

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