php.de

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

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 14.03.2010, 19:30  
Benutzer
 
Registriert seit: 03.02.2010
Beiträge: 51
PHP-Kenntnisse:
Fortgeschritten
Puccini befindet sich auf einem aufstrebenden Ast
Standard Statische Methode bei Vererbter Klasse

Hi,

ich hab eine frage zu statischen methoden bei der Vererbung in Klassen.
Und zwar definiert meine Elternklasse eine Methode statisch, so das ich diese ohne instanziirung nutzen kann.
Dabei greift sie aber auf eine Methode einer Abgeleiteten Klasse zu. dabei wird eine Exeption gewurfen (klar), nur wie löse ich das Problem?
HIer das Beispiel:
PHP-Code:
abstract class test
{
    public static function 
create()
    {
        if(!
function_exists(self::pre_show()))
            echo 
"Kein Pre-Show<br>";
        echo 
"create<br>";
    }

}
class 
test2 extends test
{
    protected function 
pre_show()
    {
        echo 
"Pre-Show";
    }
}

test2::create(); 
Ich habs mit self:: probiert. Das bezeiht sich ja aber nur auf die Elternklasse.
Ist das ein Problem welches zu Thema "späte statische bindung" gehört??
Ich habs bisher noch net verstanden XD sry.

Und nochwas.
Was sagt mir das hier:
PHP-Code:
$test->test1()->test2(); 
Ist da test2 eine Methode einer anderen Klasse? oder werden da 2 Methoden der selben Klasse nacheinander ausgeführt?

Danke
Puccini ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 14.03.2010, 19:42  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.798
PHP-Kenntnisse:
Fortgeschritten
robo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Puccini Beitrag anzeigen
Hi,

ich hab eine frage zu statischen methoden bei der Vererbung in Klassen.
Und zwar definiert meine Elternklasse eine Methode statisch, so das ich diese ohne instanziirung nutzen kann.
Dabei greift sie aber auf eine Methode einer Abgeleiteten Klasse zu. dabei wird eine Exeption gewurfen (klar), nur wie löse ich das Problem?
HIer das Beispiel:
PHP-Code:
abstract class test
{
    public static function 
create()
    {
        if(!
function_exists(self::pre_show()))
            echo 
"Kein Pre-Show<br>";
        echo 
"create<br>";
    }

}
class 
test2 extends test
{
    protected function 
pre_show()
    {
        echo 
"Pre-Show";
    }
}

test2::create(); 
Aus einer statischen methode eine nicht statische der gleichen oder einer elternklasse aufzurufen geht nur indem du einer Instanz der Klasse erstellst und die Methode aufrust [und die methode dann halt public ist] oder indem du diese methode auch statisch machst und sie dann auch nur statisch aufrufst.


Zitat:
Und nochwas.
Was sagt mir das hier:
PHP-Code:
$test->test1()->test2(); 
Ist da test2 eine Methode einer anderen Klasse? oder werden da 2 Methoden der selben Klasse nacheinander ausgeführt?

Das kann Method-Chaining bzw. ein fluent Interface sein.

Dabei wird nicht zwangs läufig eine 2 methode der ersten klasse aufgerufen.
es wird die methode test2() der Klasse aufgerufen die die methode test1() via return zurückgibt.

Wenn das $this; ist, nennt man es ein fluent interface:
Fluent interface - Wikipedia, the free encyclopedia

es wird also immer auf der zurückgegebenen klasse die methode aufgerufen.

wenn die methode ein neues objekt einer anderen klasse generiert und zurückgibt, auf dieser.
robo47 ist offline   Mit Zitat antworten
Alt 14.03.2010, 19:57  
Benutzer
 
Registriert seit: 03.02.2010
Beiträge: 51
PHP-Kenntnisse:
Fortgeschritten
Puccini befindet sich auf einem aufstrebenden Ast
Standard

Danke für die schnelle antwort.
Also das mit der Kette hab ich jetzt verstanden war also fast so wie ich mir gedacht habe :>


Nur bei dem anderen weis ich jetzt immer noch net weiter.
Folgendes Szenario:
Ich will eine Objekt-Klasse, diese definiert die Grundfunktinen meiner Objekte.
dabei gibts eine Methode "init()".
Diese instanziiert dann das Objekt selber und erzeugt einen Singleton.

Jetzt haben wir z.B. das objekt Haus:
PHP-Code:
class Haus extends Object 
Jetzt soll es jedem Objekt möglich sein eine "pre_init()" und eine "post_init()" methode zu haben, um auf die Instanziirung des Objektes einfluss nehmen zu können.

Bei einem Aufruf wie folgt:
PHP-Code:
$neues_haus Haus::init(); 
will ich also das in der "init()" überprüft wird, ob in der Klasse "Haus" eine pre_ oder post_init steckt und diese soll ausgeführt werden.

wie löse ich das jetzt am besten?
ich will nicht das die pre_ und post_ public sind, max protected! geht das überhaupt?
Puccini ist offline   Mit Zitat antworten
Alt 14.03.2010, 20:00  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.798
PHP-Kenntnisse:
Fortgeschritten
robo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblickrobo47 ist ein wunderbarer Anblick
Standard

Definiere doch in der basisklasse einfach ein pre_init() und post_init und ruf es vom konstruktur immer auf, wenn die kindklasse es nicht hat, wird das (leere?) der elternklasse aufgerufen oder mach die methoden in der elternklasse abstrakt dann müssen die kinder sie wenn auch leer implementieren.
robo47 ist offline   Mit Zitat antworten
Alt 14.03.2010, 20:04  
Benutzer
 
Registriert seit: 03.02.2010
Beiträge: 51
PHP-Kenntnisse:
Fortgeschritten
Puccini befindet sich auf einem aufstrebenden Ast
Standard

hm, hab ich auch schon gedacht.
geht das dann? wird die da überschrieben mit der des kindes?
Puccini ist offline   Mit Zitat antworten
Alt 14.03.2010, 20:28  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 379
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Puccini Beitrag anzeigen
test2::create();[/php]Ich habs mit self:: probiert. Das bezeiht sich ja aber nur auf die Elternklasse.
Ist das ein Problem welches zu Thema "späte statische bindung" gehört??
PHP: Spte statische Bindung - Manual
Da sind sogar Beispiele dabei...

Zu deinem init()-Problem gibt es simple Lösungen: abstrakt definieren (alt.: Interface) (erzwingt Implementation) oder als "leere" Methode in der Elternklasse implementieren.
Rufst du init() auf einem Kind-Objekt auf, das eine init()-Methode hat wird die des Kind-Objekts ausgeführt, fehlt die Methode wird die des Eltern-Objekts ausgeführt.

Das sind aber eigentlich OO-Grundlagen - du solltest dir also Zeit nehmen und dich in die Doku einlesen.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline   Mit Zitat antworten
Alt 14.03.2010, 20:32  
Benutzer
 
Registriert seit: 03.02.2010
Beiträge: 51
PHP-Kenntnisse:
Fortgeschritten
Puccini befindet sich auf einem aufstrebenden Ast
Standard

hmmm...
hab immer noch ein problem.

wenn ich in der init schreibe:
PHP-Code:
test2::pre_init(); 
gehts.
Woher bekomme ich aber den Namen der Kind-Klasse (in PHP < 5.3)?
da gibts kein get_called_class()...

mist...
sonst würde es ja so gehen:
PHP-Code:
    public static function init($ID false)
    {
        
$child get_called_class();
        
call_user_func(array($child,"pre_construct"));
        
//Signelton erzeugen
        
if (!isset(self::$instance[$ID]) || !self::$instance[$ID]) 
        {
            
$c $child;//__CLASS__;
            
self::$instance[$ID] = new $c($ID);
        }
        return 
test2::$instance[$ID];     
    } 
Bis auf das self und test2 zeugs bei der $instance. Da weis cih acuh noch net wie ich die der Kind-Klasse zugälgich mache... alles mit self?
:<

sorry für die sicherlich blöden fragen..
Puccini ist offline   Mit Zitat antworten
Alt 14.03.2010, 20:39  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 379
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Puccini Beitrag anzeigen
Woher bekomme ich aber den Namen der Kind-Klasse (in PHP < 5.3)?
Nirgends.
Late Static Binding wurde eben erst mit 5.3 eingeführt, um genau solche Fälle abzudecken.

Wobei ich immer noch nicht verstehe, wozu du überhaupt eine statische Methode verwendest.
Benutz' ne Factory, definier' den Konstruktor in der Elternklasse final und lass den (pre|post)init ausführen.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster 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
statische Eigenschaft einer unbekannten Klasse aufrufen Zergling-new PHP-Fortgeschrittene 30 05.01.2010 20:04
Statische Methoden oder Singleton Klasse ? lopelz PHP Tipps 2009 7 30.12.2009 14:46
Klasse für Objekteigenschaft erzeugen? Asipak PHP-Fortgeschrittene 25 30.05.2009 19:45
[Erledigt] Auf erst zur laufzeit bekannte statische Methode zugreifen? Lockhead PHP Tipps 2009 14 30.04.2009 11:15
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
statische Variable in Methode tinchen PHP Tipps 2008 5 21.12.2007 20:54
Ermitteln ob Methode geerbt wurde oder nicht? MaMo-Net PHP Tipps 2007 23 14.04.2007 00:28
String-Parser Klasse - was muss rein? Matze PHP Tipps 2007 2 08.04.2007 22:14
Auf static Methode von variabler Klasse zugreifen Riks PHP Tipps 2007 11 16.03.2007 15:08
Singleton besser als komplett statische Klasse ? Cmon PHP-Fortgeschrittene 4 13.06.2006 00:34
methode in klasse aus einer anderen starten GELight PHP Tipps 2006 10 03.06.2006 11:39
PHP 5 : Methode außerhalb der Klasse definieren Unknown PHP Tipps 2006 9 23.05.2006 11:31
problem mit einer methode in einer klasse PHP Tipps 2007 4 18.12.2005 16:14
PHP5: Klassenattribut für statische Methode, mit Vererbung PHP-Fortgeschrittene 9 24.05.2005 09:35
OOP: offizielle php funktion als methode einer klasse ... PHP Tipps 2004 4 17.09.2004 04:24

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
http://www.php.de/php-fortgeschrittene/65716-statische-methode-bei-vererbter-klasse.html, php gibt es abstrakte statische klasse, php statische methode vererben, php statische methoden von außerhalb aufrufen, php klassen eltern, php eltern methode, php kind methode aufrufen, können finale methoden in php ausgeführt werden, php statische methoden vererbung, php methode aus child aufrufen, php: späte statische bindung, methoden von vererbten klassen benutzen, elternklasse funktion intern aufrufen c, php zugriff auf static eigenschaft von elternklasse, static methoden einer klasse, php statische funktion vererben, variable aus eltern klasse nutzen php, statische funktion auf vererbte funktion zugreifen, php auf statische methode der elternklasse zugreifen, init methode für statische klassen in php

Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 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