Portal > Foren > PHP > PHP-Programmierung > Late Static Binding in PHP
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 10.02.2008, 20:21 Nach oben    #1
Christian Schuhmann
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 66
Standard Late Static Binding in PHP

Hallo zusammen,

in letzter Zeit hab ich das Forum mehr als Leser beobachtet, aber jetzt habe ich wieder eine kleines "Problemchen".

Folgendes: Ich habe einen Application-Controller (abstract class Engine_Controller_Application) der als Singleton auftritt.
D.h. das ich auch den Entwickler später zwingen möchte seinen Application-Controller als Singleton zu erstellen:

PHP-Code:
abstract class Engine_Controller_Application
{
    private static 
$_instance null;
    
    final private function 
__construct() {}
    
    final private function 
__clone() {}
    
    final public static function 
getInstance()
    {
        
$classname get_class();
        if(
self::$_instance === null) {
            
self::$_instance = new $classname;    
        }
        return 
self::$_instance;
    }
    
    abstract public function 
getControllerDirectories();
    
    
// mehr abstrakte Methoden ...   

Leider macht mir PHP einen Strich durch die Rechnung, da get_class immer Engine_Controller_Application zurück liefert.
(Late Static Binding soll mit PHP 5.3 kommen)

Deswegen wollte ich fragen ob jmd. eine parktikable Lösung/Workaround für sowas hat.
Der Weg über debug_backtrace ist leider zu langsam.

Grüße,
Christian
bobby ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.02.2008, 21:26 Nach oben    #2
Benjamin Steininger
 
Benutzerbild von robo47
 
Registriert seit: 02.06.2005
Ort: weiher im tiefsten Odenwald
Beiträge: 1.204
Standard

eventuell unschöner Weg:

statische Variable die in der erbenden Klasse mit dem Klassennamen vorbesetzt wird.

mal ein kurzer Beispielcode noch:

PHP-Code:
class classA
{
    static private 
$name 'classA';
    
    static public function 
getInstance()
    {
        return 
self::$name;
    }
}

class 
classB extends classA
{
    static private 
$name 'classB';
    
    static public function 
getInstance()
    {
        return 
self::$name;
    }
}

echo 
classB::getInstance();
echo 
classA::getInstance();
exit(); 

Geändert von robo47 (11.02.2008 um 00:48 Uhr)
robo47 ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 12.02.2008, 19:18 Nach oben    #3
Christian Schuhmann
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 66
Standard

Hi Benjamin,

danke für deine Antwort. Das wird wohl leider die einzige Lösung bleiben - wenn auch nicht besonders elegant.

Grüße,
Christian
bobby ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2008, 14:10 Nach oben    #4
Bastian Fenske
 
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 853
Standard

In dem Fall würde ich aber eine Methode benutzen und in der Methode der Basisklasse eine Exception werfen:

PHP-Code:

abstract class Singleton 
{
    private static 
Instance;
 
    protected static function 
getClassName()
    {
        throw new 
BadImplementationException();
    }
     
    public static final function 
getInstance() 
    {
        if (!
self::Instance) {

            
$sName self::getClassName();
            
self::Insatnce = new $sName;
        }
        return 
self::Instance;
    } 

 
class 
MySingletonImplementation extends Singleton 

    protected static function 
getClassName() 
    { 
        return 
__CLASS__
    } 

Ganz sicher ist die Kiste aber natürlich so nie.

Basti

Geändert von Basti (13.02.2008 um 14:13 Uhr)
Basti ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.02.2008, 22:04 Nach oben    #5
Christian Schuhmann
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 66
Standard

Hi Basti,

ja so ähnlich hab ich es letztendlich auch gelöst.

Zitat:
Zitat von Basti Beitrag anzeigen
Ganz sicher ist die Kiste aber natürlich so nie.
Das hab ich mir auch gedacht und mich mal ins Thema LSB in 5.3 eingelesen. So ganz überzeugt bin ich noch nicht - aber irgendwann muss ich die Version auschecken und selber ausprobieren.

Hat das denn jmd. schon gemacht?

bobby
bobby ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

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 sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP 5.2 Kompilierung schlägt fehl Byrel Tools, Server, Betriebssysteme 0 03.11.2006 21:09
[Rezension] PHP 5 Kochbuch Artemis Literatur 2 07.09.2006 19:15
PHP 5.1.5, PHP 4.4.4 und PHP 5.2.0 RC2 veröffentlicht Ben Nachrichten 2 01.09.2006 16:05
PHP 5 benötigt kein static dejan_spasic PHP-Programmierung 7 10.02.2006 16:48
Neue PHP "release candidates": PHP 4.4.2 RC 1 und PHP 5.1 RC 6 Ben Nachrichten 1 21.11.2005 20:48


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45