2009-07-26 8 views
1

Ich habe eine Weile an meinem eigenen kleinen Framework gearbeitet, zu meinem eigenen Vorteil, und habe immer wieder den Code gelesen, während ich neue Sachen lerne. Wie zu erwarten, habe ich ein Registry-Objekt, das von fast jedem anderen Objekt verwendet wird.Was ist der effizienteste Weg, um mit einem Singleton zu interagieren?

Derzeit ist die grundlegendste Objekt (AFObject) ist ein wenig wie diese

absract class AFObject { 

    var $_registry; 

    function __construct(){ 
     $this->_registry = AFRegistry::getInstance(); 
    } 

} 

jedes Objekt jetzt so eingerichtet wird, einen lokalen Bezug auf die Registry enthalten. Wenn also Hunderte von Objekten zu einem Zeitpunkt instanziiert werden, sind das Hunderte von Referenzen auf den Singleton. Aber wäre es mehr oder weniger effizient sein, immer auf die Registry wie diese direkt zu beziehen ...

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::$foo = $bar; 
    } 

} 
+2

sollten Sie public, protected oder private anstelle des var-Schlüsselworts in PHP 5 verwenden. –

Antwort

0

Ich glaube nicht, Sie Effizienz in diesem Fall denken sollte (da 100 Referenzen wirklich kein Problem ist, und ist ein bisschen vorzeitige Optimierung). Aber bedenken Sie, was in Ihrem Code am elegantesten ist. Denken Sie auch darüber nach, ob Sie ein Singleton benötigen (könnte es als statische Klasse implementiert werden?). Ich würde vielleicht wählen, Ihren zweiten Fall zu verwenden, da das Ihren Code ein wenig offensichtlicher macht (zumindest denke ich das).

In diesem Fall wäre es

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::getInstance()->$foo = $bar; 
    } 

} 

oder wenn Sie Ihre Immobilie kapseln:

class AFRouter extends AFObject { 

    function someMethod($bar){ 
     AFRegistry::getInstance()->setFoo($bar); 
    } 

} 
2

Meiner Meinung nach, "Registry" Art der Klassen Art smells.

Da Sie erwähnt haben, dass Sie dies tun, um zu lernen und besser zu werden, haben Sie jemals in Erwägung gezogen, Ihre Registrierungsklasse vollständig zu beseitigen und einen anderen Ansatz zu wählen? Vielleicht erforderliche Daten zu Klassenkonstruktoren schieben, statt sie aus dem Inneren der Klasse zu ziehen?

Ich würde auslassen Option 1 (abstrakte Basisklasse), weil dann alle Klassen auf einigen anderen Klassen abhängig wird ...

Mit einer statischen Klasse wie Yngve Sneen würde der beste Ansatz sein erwähnte meine Meinung, wenn Sie eine Registrierung einrichten möchten.

So etwas wie: registry :: set ('var1', $ var1); $ var1 = registry :: get ('var1');

1

Bedenken Sie:

class AFRouter extends AFObject { 
    function someMethod($bar) { 
    global $af_registry; 
    $af_registry->setFoo($bar); 
    } 
} 

oder sogar:

class AFRouter extends AFObject { 
    function someMethod($bar) { 
    af_registry_set('foo', $bar); 
    } 
} 

Bar die Syntax, gibt es im wesentlichen keinen Unterschied zwischen dieser und Ihrer aktuellen Lösung.

Ja, das bedeutet, dass Ihre Registrierung im Wesentlichen eine globale Variable ist. Und ja, es gibt Probleme mit globalen Variablen. Eine bessere Option wäre pass in the dependencies.

Verwandte Themen