php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.04.2005, 15:47  
Gast
 
Beiträge: n/a
Standard PHP5: Klassenattribut für statische Methode, mit Vererbung

Hi!

Ich habe eine (abstrakte) Oberklasse und eine Unterklasse, welche von der Oberklasse erbt. In der Unterklasse wird ein Attribut angelegt (bzw. z. Z. überschrieben), welches von einer statischen Methode der Oberklasse ausgelesen werden soll. (Aufruf: Unterklasse::statische_methode(), wobei die Statische Methode in der Unterklasse nicht überschrieben wird und somit immer die Methode der Oberklasse genommen wird.)

Hab es mit self::$attribut versucht. Da wird aber immer immer das Attribut von der Oberklasse genommen.

Ein Work-Arround wäre, die Methode in der Unterklasse zu überschreiben und die Methode der Oberklasse mit dem Attribut als Paramter zu übergeben. Aber gibt es da keine elegantere Möglichkeit?

Hoffe, ihr könnt mir helfen.
Konstantin

Edit: Damit es klar wird: Meiner Meinung nach, müsste das sowas wie das Gegenteil von parent::$attribut sein. Quasi child::$attribut, was es aber AFAIK nicht gibt ...
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 25.04.2005, 21:15  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Pech. Nächste PHP-Version vielleicht.

http://bugs.php.net/bug.php?id=30934
(am besten abstimmen und sagen dass es wichtig ist, dass das gefixt wird)
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 25.04.2005, 21:20  
Gast
 
Beiträge: n/a
Standard

OK, Schade.
Trotzdem danke!
  Mit Zitat antworten
Alt 25.04.2005, 21:25  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Wobei die Diskussion um den Bug wohl darauf hinausläuft, dass das gerade oder bald gefixt wird. Also abstimmen, damits schneller geht!
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 29.04.2005, 12:59  
Gast
 
Beiträge: n/a
Standard

OK, das hab ich umgehen können.

Jetzt hab ich aber ein änliches Problem, welches auf den gleichen Bug hinausläuft:

Es seien:
  • Oberklasse::a()
  • Oberklasse::b()
  • Unterklasse::b()

(alles statische Methoden)
Aus Oberklasse::a() möchte ich die die Unterklasse::b() aufrufen. mit self::b() erreicht man ja immer nur Oberklasse::b(). Nun hab ich mir gedacht, ich könnte Oberklasse::a() in Unterklasse überschreiben:
Code:
public static function a()
{
   return parent::a("Unterklasse");
}
Und in der Oberklasse a() wie folgt implementieren:
Code:
public static function a($class_name)
{
   return $class_name::b();
}
Das scheint aber nicht zu gehen. (return Unterklasse::b() geht aber!) Hat das ein Grund? Z. B.:
Code:
return new $class_name();
geht ja.

Gibt es eine Andere Möglichkeit, den Bug zu umgehen?

Bin für jede Anregung dankbar.
  Mit Zitat antworten
Alt 23.05.2005, 22:30  
Gast
 
Beiträge: n/a
Standard

@Waq:
Woran sehe ich denn, dass der Bug gefixt ist und ab welche Version das geschen ist. Wird das dann auf der Seite stehen, die du oben angegeben hast?
... ich blick da irgendwie nicht ganz durch.
  Mit Zitat antworten
Alt 23.05.2005, 22:58  
Erfahrener Benutzer
 
Registriert seit: 18.09.2003
Beiträge: 13.598
PHP-Kenntnisse:
Fortgeschritten
imported_Ben ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Schauste dann mal hier rein:
http://www.php.net/ChangeLog-5.php
imported_Ben ist offline   Mit Zitat antworten
Alt 24.05.2005, 02:05  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Hallo zusammen.

Elegant ist anders, aber ein Weg wäre Folgendes:
PHP-Code:
<?php
class Oberklasse
{
    public static function 
a()
    {
        return 
self::child_method('b');
    }
    
    private function 
child_method($method)
    {
        
$bt debug_backtrace();
        
$child_class $bt[2]['class'];
        eval (
"\$return = $child_class::$method();");
        return 
$return;
    }
}

class 
Unterklasse extends Oberklasse
{
    public static function 
a()
    {
        return 
parent::a();
    }

    public function 
b()
    {
        return 
'...ein B aus der Unterklasse';
    }
}

echo 
Unterklasse::a();
?>
Die Idee mit dem Workaround via debug_backtrace() stammt aus einem Kommentar im Manual[1]. Den Trick verreißt es dir halt, wenn du die Klassen tiefer schachtelst. Der Autor des Kommentars durchwandert den Backtrace, bis zum letzten Eintrag, bei dem das Feld "Function" mit dem Namen der aktuellen Methode übereinstimmt. Das ist natürlich wiederum anfällig, wenn die aufrufende Methode den gleichen Namen trägt...

[1] http://php.net/manual/en/ref.classobj.php

Und die eval()-Geschichte müsstest du hat noch ein wenig absichern...

Basti
Basti ist offline   Mit Zitat antworten
Alt 24.05.2005, 06:05  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von konstantin
@Waq:
Woran sehe ich denn, dass der Bug gefixt ist und ab welche Version das geschen ist.
Scheint so, als würde daran doch nichts gemacht, wobei es in Java und C++ wohl genauso ist.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 24.05.2005, 09:35  
Gast
 
Beiträge: n/a
Standard

@bbastix: Danke, werde ich mir mal angucken. Das hört sich doch nach was an.

@Ben: Danke.

@Waq: Schade.
  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
statische Variable in Methode tinchen PHP Tipps 2008 5 21.12.2007 20:54
PHP5: DOMDocument + vererbung Syntaxx PHP-Fortgeschrittene 4 07.06.2006 09:02
[Erledigt] PHP5 - Vererbung: Aufrufen einer Methode der Oberklasse PHP-Fortgeschrittene 2 25.04.2005 13:01

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php klassenattribute, php klassenattribut, php static vererbung, klassenattribute php, php vererbung überschreiben, php static vererben, php self vererbung, php vererbte methode überschreiben, php vererbung static, klassenattribut php, php5 statische klassen, php vererbung methoden überschreiben, klassenattribut, php attribute vererben, php vererbung attribute, static vererbung php, php vererben self, php vererbung self, php statische methoden überladen, php vererbung methode überschreiben

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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.