php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 11.01.2012, 13:26  
meikel
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von tr0y Beitrag anzeigen
Das war noch nicht ausführlich ^^
<ggg>
Aber ausreichend verständlich.
Zitat:
Zu deinem Source.. äh, wie jetzt ? Kontext-Sprung ? o_O
Zu wenig Text? Ein kleiner Kontextsprung, weil ich (hoffentlich richtig) ahne, welche Ziele der TS anstrebt und welche Probleme er abfragt.
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 11.01.2012, 17:56  
php.de
Gast
 
Beiträge: n/a
Standard

Vielen Dank für die wirklich sehr interessanten Beiträge.

Mein PHP-Singleton-Pattern sieht nun folgendermaßen aus:
PHP-Code:
<?php
   
class {
      private static 
$instance;
      private function 
__construct() {
      }
      public static function 
get() {
         if (
self::$instance === null) {
            
$class get_called_class();
            
self::$instance = new $class;
         }
         return 
self::$instance;
      }
      private function 
__clone() {
      }
      private function 
__wakeup() {
      }
   }
?>
Eines würde mich noch interessieren: darf man eigentlich von einer Singleton-Klasse erben?
  Mit Zitat antworten
Alt 11.01.2012, 18:10  
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

Das macht so keinen Sinn. get_called_class() ist das Pendant zu static, ergo hast Du zwar ein Abstarct Singleton gebastelt (was Deine Frage beantworten sollte), allerdings speicherst Du die Instanz immer in C::$instance. Folglich kannst Du nicht mehrere von C erbende Klassen gleichzeitig instanziieren.
__________________
--
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   Mit Zitat antworten
Alt 11.01.2012, 18:25  
php.de
Gast
 
Beiträge: n/a
Standard

Eigentlich hätte mich interessiert, wie das Singleton-Patter spezifiert ist. Darf man lt. Spezifikation von einer Singleton-Klasse erben?
  Mit Zitat antworten
Alt 11.01.2012, 18:47  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Zitat:
Zitat von php.de Beitrag anzeigen
Eigentlich hätte mich interessiert, wie das Singleton-Patter spezifiert ist. Darf man lt. Spezifikation von einer Singleton-Klasse erben?
Ein Singleton besagt das es nur eine Instanz der Klasse die das Singleton repräsentiert geben darf. Jedes Class-child, bildet eine solche Klasse.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Alt 11.01.2012, 18:49  
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

Über Vererbung macht ST keine Aussage. Folglich: Ja. Oder besser: Es ist nur ein Pattern, also mach das vom Anwendungsfall ab. Ein schlichtes final reicht ja.
__________________
--
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   Mit Zitat antworten
Alt 12.01.2012, 11:03  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Zitat:
Zitat von php.de Beitrag anzeigen
Vielen Dank für die wirklich sehr interessanten Beiträge.

Mein PHP-Singleton-Pattern sieht nun folgendermaßen aus:
PHP-Code:
<?php
   
class {
      private static 
$instance;
      private function 
__construct() {
      }
      public static function 
get() {
         if (
self::$instance === null) {
            
$class get_called_class();
            
self::$instance = new $class;
         }
         return 
self::$instance;
      }
      private function 
__clone() {
      }
      private function 
__wakeup() {
      }
   }
?>
Eines würde mich noch interessieren: darf man eigentlich von einer Singleton-Klasse erben?
Um hier nochmal genereller drauf einzugehen, es ist sogar in einigen Fällen sinnvoll Singletons zu vererben, z.b. wenn man gewährleisten will das...

... Kind-Klassen Singletons sind, spätere Kind-Klassen aber nicht irgendetwas anderes werden können:

PHP-Code:
class Singleton {

    private static 
$_instances = array();

    final public static function 
getInstance() {
        return !isset(
self::$_instancesget_called_class() ])
                ? 
self::$_instancesget_called_class() ] = new static
                : 
self::$_instancesget_called_class() ];
    }
    
    final protected function 
__clone() {}
    
    protected function 
__construct () {
        echo 
__CLASS__.'-Class representation of construct.'."\n";
    }

}

class 
superSingleton extends Singleton {
    
    protected function 
__construct () {
        echo 
__CLASS__.'-Class representation of construct.'."\n";
    }
    

Oder die interessantere Variante:

... abstrakte Singletons Grundlage für ein "Instanziier mich einmal, aber sonst keine Kinder von mir"-Singletons.

PHP-Code:
abstract class aloneSingleton {

    private static 
$_instance;
    
    final public static function 
getInstance() {
        if ( !
is_nullself::$_instance ) ) {
            if ( 
get_class(self::$_instance) !== get_called_class() )
                throw new 
LogicException(get_called_class().' is an subclass of '.__CLASS__
                    
.', instances are restricted to one instance overall, '
                    
.'you tried to access the wrong stage of inheritance, use '
                    
.get_class(self::$_instance).' instead.');
            else return 
self::$_instance;
        }
        else {
            
self::$_instance = new static;
        }
        
        return 
self::$_instance;
    }

    abstract protected function 
__construct();

}

class 
extends aloneSingleton {
    
    protected function 
__construct() { echo __CLASS__.' created.'; }
    
}

class 
extends aloneSingleton {

    protected function 
__construct() { echo __CLASS__.' created.'; }

}

class 
extends {

    protected function 
__construct() { echo __CLASS__.' created.'; }

}

class 
extends {

    protected function 
__construct() { echo __CLASS__.' created.'; }


PHP-Code:
a::getInstance(); // all be good 
PHP-Code:
a::getInstance();

/* thousands of lines later */

d::getInstance(); // LogicException 
Ein Parade-Beispiel dafür wäre ein Log-Interface das du als Singleton entwickelst, aber bei dem du nicht möchtest, das Beispielsweise Error-Reporting zum User tritt und in einem file geloggt wird ( gleichzeitig ), sondern nur in ein File geloggt wird oder die Fehler zum User übermittelt werden. Diese Form der Processing-Logik ermöglich ebendso anderen Entwicklern nicht unabsichtlich irgendwo logs anzustoßen, die sie später beispielsweise nicht mehr wiederfinden, weil sie nicht wussten das sie überhaupt aktiviert wurden.

Wie nikosch schon sagte, Pattern sind Vorlagen, keine Entgültigen Stempel wie Dinge aussehen müssen. Klar sollte man sich schon an das Konzept halten, aber Design Patterns werden dir nie sagen ob sie in ihrer Basis vererbbar sind oder nicht. ( Ich denke da würde das Gesamt-Konzept Vererbung auch hinsichtlich Design-Patterns ins wanken geraten )
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (12.01.2012 um 11:28 Uhr).
tr0y 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
[Erledigt] self:: vs. $this-&gt; Cube PHP Tipps 2009 2 01.10.2009 20:16
Unterschied zwischen self, parent, this dennito PHP Tipps 2008 7 21.12.2008 12:24
Php self PHP Tipps 2005 4 26.03.2005 14:04


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