php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.12.2007, 01:57  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard statische Variable in Methode

Hallo,

mir ist die Frage ja fast ein wenig peinlich, aber gibt es hier einen Unterschied, was die statische Variable angeht?

PHP-Code:
<?php
static public function &getInstance($id)
{
        static 
$instances;

        if(!isset(
$instances)) 
        {
            
$instances = array();
        }

        if(!isset(
$instances[$id]))
        {
            
$instances[$id] = new Foo($id);
        }
        return 
$instances[$id]; 
}
?>
und

PHP-Code:
<?php
static public function &getInstance($id)
{
        static 
$instances = array();

        if(!isset(
$instances[$id]))
        {
            
$instances[$id] = new Foo($id);
        }
        return 
$instances[$id]; 
}
?>
Tine
tinchen ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 21.12.2007, 02:11  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Nein, eigentlich nicht. Hast du unterschiedliche Rückgabewerte?

Ich schreibe das allerdings immer etwas anders:
PHP-Code:
<?php
class MyClass
{
  protected static 
$_instances = array(); // eigenschaften, ob statisch oder nicht direkt in den klassen kopf
  
public static function getInstance($id// egal welche reihenfolge public/static 
  
{
    if (!
array_key_exists($idself::$_instances)) { // egal ob isset/array_key_exists
      
self::$_instances[$id] = new Foo($id); // egal ob self:: oder MyClass::
    
}
    return 
self::$_instances[$id];
  }
}
?>
Ich definiere die statische Eigenschaft also für die Klasse, nicht für die Methode. Der Unterschied ist wohl einzig der, dass bei deiner Variante nur diese Methode darauf zugreifen kann, bei meiner die ganze Klasse. Ob man das will bleibt offen, aber deine Variante kommt mir doch sehr altbacken aus der prozeduralen Welt bekannt vor ..

Im Übrigen werden Objekte in PHP 5 implizit als Referenz übergeben, das & aus &getInstance kannst du also getrost streichen. Wenn du die umgekehrte Variante möchtest, benutz das Schlüsselwort "clone". Aber das ist wohl etwas OT.
Zergling-new ist offline  
Alt 21.12.2007, 02:32  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard

Hallo Zergling,

unterschiedliche Rückgabewerte gibt es natürlich nicht, aber es könnte doch sein, dass trotzdem ein wirklicher Unterschied besteht. Wäre nicht das erste Mal, dass es "funktioniert" und sich hinterher an irgendeiner Stelle heraustellt, dass es doch nicht so ganz passt. Mit der Referenz hast du natürlich recht, hatte erst gerade begonnen das komplett in php5 umzuschreiben und da ist wohl etwas hängen geblieben.

Was ich nicht verstehe ist, warum du gerne eine statische Variable für die gesamte Klasse haben möchtest. Ich sehe da nun erst einmal keinen Mehrwert, wenn ich diese Variable nur in der Methode benötige.

Für clone gibt es hier ein protected function __clone(), aber das ist ja wiederum eine ganz andere Sache, die ja mit dem eigentlichen Thema nicht viel zu tun hat.

Allerdings musst du mir die Bemerkung zur "altbackenen prozeduralen" Lösung mal erklären. Was hat diese kleine Auschnitt mit altbacken zu tun? Vor allem kann ich nicht entdecken, wie du von diesem Code auf prozedural schließt. Anhand einer Methode könnte ich sicherlich keine Aussage machen. Ich hoffe doch, dass du mich in diesem Bezug doch noch wissend machst.

Grüße
Tine
tinchen ist offline  
Alt 21.12.2007, 11:59  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Naja nehmen wir an du möchtest nun noch zusätzlich die Anzahl der vorhandenen Instanzen wissen, oder welche es gibt - was machst du nun?

Ich kannte halt "deine" Art der statischen Variablen (vergleiche Eigenschaften) nur von Funktionen. Da machten sie für mich Sinn, weil der Scope eben schon die ganze Funktion und damit für ganze Konstrukt (Funktion) verfügbar war. Jetzt erzeugst du in einer Methode (einer Aktion sozusagen), die ja in einem größeren Zusammenhang steht (dem Objekt/Klasse) nochmal so einen mehr oder weniger künstlichen Scope, der rein inhaltlich eigentlich zum Objekt bzw. der Klasse und nicht zur Aktion gehört (finde ich).

Ist für mich halt ein altbewährtes prozedurales Verhalten (statische Variablen) auf die OOP Welt übertragen (statische Eigenschaften), obwohl diese bereits flexiblere Techniken bereitstellt. Aber es funktioniert, es ist nicht falsch und damit akzeptabel =)
Zergling-new ist offline  
Alt 21.12.2007, 14:59  
Erfahrener Benutzer
 
Registriert seit: 16.02.2006
Beiträge: 303
tinchen
Standard

So kann ich deine Gedanken auch verstehen. Diese Argumentation hift mir persönlich viel mehr als die Darstellung von Code. Dieser ist nämlich in beiden Lösungen trivial. Die Intention, Idee, Planung und der nötige Tipp, welche höherwertige Konsequenz das haben könnte, bringt mich erst nach vorne. Ist das nachvollziehbar? Also ich danke dir für die Preisgebung der Idee, insbesondere welche Vor- und Nachteile die unterschiedlichen Lösungen bezogen auf deine und meine Lösung haben. Diese siehe ich nämlich nicht immer, wird aber alles sofort in den "internen Speicher" gegeben. :wink:

In meiner Lösung geht es ja nur darum die Instanz der Klasse bezogen auf einen Parameter nur ein einziges mal zu erhalten. Im Verlauf ist in diesem Fall nicht wichtig wie viele Instanzen es gibt oder welche Instanzen vorhanden sind.

Viele Grüße
Tine
tinchen ist offline  
Alt 21.12.2007, 20:54  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

Zitat:
In meiner Lösung geht es ja nur darum die Instanz der Klasse bezogen auf einen Parameter nur ein einziges mal zu erhalten. Im Verlauf ist in diesem Fall nicht wichtig wie viele Instanzen es gibt oder welche Instanzen vorhanden sind.
dann muss du die parameter in eine statischer Klassenvariable spaeichern, da es wirklich schiefgehen könnte eine statische aber nicht klassenvariable innerhalb von statischer methode zu haben.
sonnst hast du von prinzip alles richtig gemacht mit ausnahme, dass du static an falscher stelle platziert hast
PHP-Code:
class OneInstance{
  private static 
$parameter=array();
  public static function 
getInstance($id)
  {
     if(isset(
self::$parameter[$id]))
        return 
self::$parameter[$id];
    
     return 
self::$parameter[$id]= new Foo($id);
  } 


du kannst auch in deiner Klasse 'Foo' get Instance beschreiben.
dafür muss du nur Singeltonpattern ein wenig anpassen.
PHP-Code:
class Foo{
  public 
$id;
  private static 
$parameter=array();
  
  
//private construktor, BEISPEL
  
private function __construct($id)
 {
    
$this->$id;
 }
  public static function 
getInstance($id)
  {
     if(isset(
self::$parameter[$id]))
        return 
self::$parameter[$id];
    
     return 
self::$parameter[$id]= new self($id);
  } 


also jetzt kannst du direkt
Foo::getInstance(3);
verwenden und brauchst nicht mehr alles in einer anderer Klasse zu verlagern.
__________________
Slava
http://bituniverse.com
Slava ist offline  
 


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
Variable in Datenbankentrag asa PHP Tipps 2008 11 22.07.2008 09:51
Variable in SQL Anweisung verwenden Beatbox PHP Tipps 2006 2 08.08.2006 16:32
Variable in $this Variable der Klasse benutzen PHP Tipps 2006 5 03.05.2006 20:04
unset() in Methode Werkler PHP Tipps 2006 2 28.03.2006 21:59
PHPMailer findet eigene Variable net seejay PHP Tipps 2007 6 04.01.2006 12:55
problem mit variable snatch-ic PHP Tipps 2007 5 13.12.2005 13:18
Variable durch 2. Variable bestimmen Quagga PHP Tipps 2005-2 11 26.10.2005 17:34
[Erledigt] Variable wird nicht erkannt bzw ausgegeben. PHP Tipps 2005-2 4 25.10.2005 18:54
Variable als Variable behandeln ohne den Wert zu verwenden Pain-maker PHP Tipps 2005-2 4 11.09.2005 17:28
PHP5: Klassenattribut für statische Methode, mit Vererbung PHP-Fortgeschrittene 9 24.05.2005 09:35
Variable in Variable Matthiasnet PHP Tipps 2005 6 20.03.2005 23:28
Variable in einer Variable Beatbox PHP Tipps 2005 7 15.01.2005 15:55
Warum wird Variable nicht übergeben??? Anuschka PHP Tipps 2005 2 06.01.2005 13:22
[Erledigt] Datei einlesen -&gt; in Variable schreiben PHP Tipps 2004 2 22.07.2004 11:33
variable Variablen requesten PHP Tipps 2004 5 08.06.2004 20:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php statische variablen in methoden, php variable in methoden erhalten static, php new self parameter, reihenfolge public static egal warum?, \egal welche reihenfolge\ \darstellung\

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