php.de

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

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 26.07.2007, 00:21  
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 referentieller T_PAAMAYIM_NEKUDOTAYIM

Daran, dass statische Methoden - mir immer noch unerklärlicherweise - nur über Umwege für eine dynamische Klassenangabe aufgerufen werden können, habe ich mich bereits gewöhnt.
Nun stellt sich mir das Problem, dass diese Methode eine Referenz zurückliefern soll, was mit der folgenden Lösung keinen Fehler erzeugt, aber auch nicht funktioniert:
PHP-Code:
<?
class Singleton 
  
{
  public static function & 
getInstance ()
    {
    
// ...
    
}
  }

$sClassname 'Singleton';
$oReference = & call_user_func (array ($sClassname 'getInstance'));
Hat jemand eine Idee, jenseits der blöden eval () Lösung:
PHP-Code:
<?
eval ('$oReference = & ' $sClassname '::getInstance();');
??
nikosch ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 26.07.2007, 00:38  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Lösung? Jo, nimm PHP5

Was wie ein blöder Spruch klingen mag, is aber mein voller Ernst: Wenn schon OOP, dann PHP5. Dort werden Objekte standardmässig als Referenz übergeben und nicht als "Wert" (bei Objekten "Kopie").

Öhm ... OK, sehe grad, du verwendest PHP5, weil sonst wär das "public"-Token schwerlich möglich ^^ Wo issn dann das Problem? Geht es etwa so net?
PHP-Code:
<?php
class Singleton
{
  public static function 
getInstance ()
  {
    
// ...
  
}
}

$sClassname 'Singleton';
$oReference $sClassname::getInstance();
?>
Nein, geht nicht Aber wieso willste denn den Klassennamen überhaupt dynamisch haben?
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline   Mit Zitat antworten
Alt 26.07.2007, 00:53  
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

Naja, trotz Forenregeln ist das ein künstliches Beispiel um die Problematik zu schildern. Original will ich in einer SingletonFactory Methode Singleton-Objekte erzeugen.
Das mit den Referenzen geht schon bei php5. Da gibts nur ein Problem: Die Referenz ist keine echte Referenz wie ich sie nur durch & $object bekomme, sondern irgendeine komische Objektreferenz. Deutlich wird das hier:

PHP-Code:
<?

class a
  
{
  var 
$i=5;
  } 

class 
b
  
{
  static 
$instance null;
  
  function & 
create ()
    {
    if (
null === self::$instanceself::$instance = new a;
    return 
self::$instance;
    }
  } 



$a b::create ();
$b $a;
$c = & $a;

$b->6;

var_dump($a $b $c);

/*

object(a)#1 (1) {
  ["i"]=>
  int(6)
}
object(a)#1 (1) {
  ["i"]=>
  int(6)
}
object(a)#1 (1) {
  ["i"]=>
  int(6)
}

*/

$b null;

var_dump($a $b $c);

/*

object(a)#1 (1) {
  ["i"]=>
  int(6)
}
NULL
object(a)#1 (1) {
  ["i"]=>
  int(6)
}

*/

$c null;

var_dump($a $b $c);

/*

NULL
NULL
NULL

*/
Wie man sieht (erstes dump) wirkt sich $b->i = 6; auf alle 3 Objekte aus. Also ist schon eine Art Referenz da, auch wenn ich $b mit $b = $a; erzeuge. Deutlich wird der Unterschied, wenn ich eines der Objekte null setze. Nur eine Aktion auf eine echte Referenz löscht mir alle Objekte (wie im dritten dump sichtbar).

Ich würde mir das ja alles sparen, aber wenn ich mein Singletonobjekt nicht ordentlich gelöscht bekomme ist das ganze Pattern umsonst.
.
nikosch ist offline   Mit Zitat antworten
Alt 26.07.2007, 01:27  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Interessantes Verhalten, is mir persönlich neu, ergibt aber Sinn.

Zunächst einmal: Eine Referenz bedeutet nicht, dass eine Variable, die ein Objekt enthält, dieses Objekt ist.
PHP-Code:
<?php
$a 
= new StdClass ();
$b $a;
?>
In diesem Fall zeigen $a und $b auf das selbe Objekt, sie sind es aber nicht. Insofern würde eine neue Zuweisung von $b dieses zwar beeinflussen, dass Objekt und speziell $a nicht. $b etwas zuweisen bedeutet hier nicht das Objekt zu verändern.

Das verhalten von & find ich persönlich grad etwas merkwürdig ^^ Im Handbuch steht etwas anderes. Is ja auch egal, zumindest scheint sich dort der Variablenbezeichner direkt auf die Referenz zu beziehen, sprich: Intern sind $a und $b identisch.

Naja, mag jetzt net ganz korrekt sein, aber kommen wir zum Thema zurück:
Zitat:
Ich würde mir das ja alles sparen, aber wenn ich mein Singletonobjekt nicht ordentlich gelöscht bekomme ist das ganze Pattern umsonst..
Wozu überhaupt? Mit Ende des Request ist eh vorbei Brauchst du den Speicher wirklich? Interessant auch:
PHP-Code:
<?php
$a 
= new StdClass ();
$a null;
// oder
$a = new StdClass ();
unset(
$a);
?>
In beiden Fällen hängt das Objekt trotzdem im Speicher rum, bis der Garbage-Collector mal vorbei wandert Also auch wenn du sämtliche Referenzen entfernst, heißt das noch nicht, dass du davon irgendeinen Vorteil hast
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline   Mit Zitat antworten
Alt 26.07.2007, 01:41  
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

Naja, ich dachte eben, es wäre sinnvoll, ein Singleton-Objekt löschen und es anschl. z.B. neu instanzieren (und z.B. anders initialisieren) zu können. Eine konkrete Anwendung fällt mir gerade nicht ein. Wenn ichs aber löschen möchte, dann sinnvollerweise über die Factory oder über die abstrakte Klasse, die den Singleton-'Cache' verwaltet. Lösche ich daraus aber ein Objekt, so sind nur bei echten Referenzen mit & auch die entsprechenden Variablen auf null gesetzt, denen ich mit getInstance(); das Objekt zugewiesen habe. Ansonsten habe ich die schönste Inkonsistenz, die ich im ST Pattern haben kann: im Cache existiert kein Objekt, also wird beim nächsten Aufruf der getInstance() Methode ein neues erzeugt, in der Variable ist aber noch das alte Objekt, das jetzt nicht mehr identisch mit dem neuen ist.

Eine Variante wäre, jede ST Klasse ihre eigene Objektinstanz statisch vorhalten zu lassen, statt die ST Instanzen zentral zu verwalten. Spätestens, wenn ich diese Klassen aber über eine Factory verwalten möchte wirds knifflig. Das hab ich noch nicht hinbekommen.
nikosch ist offline   Mit Zitat antworten
Alt 26.07.2007, 01:45  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Ein Singleton zu löschen und neu zu instanzieren wäre keine Singleton Ein Singleton ist ein "einzigartiges Objekt", dass heißt, dass auch nach seiner Existenz kein weiteres seiner Art existiert, wobei das eher eine Ausnahmesituation ist, weil ein Singleton eigentlich immer während der gesamten Laufzeit existiert.

Was aber vergleichbar wäre: Ein Objekt, das den Ausgangszustand des Singleton-Objektes entspricht, was sich sicher durch eine Art reset()-Methode umsetzen lässt. Wenn sich sonst noch Methoden dran hängen, sind die eben selbst Schuld
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline   Mit Zitat antworten
Alt 26.07.2007, 01:47  
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

Zitat:
Zitat von KingCrunch
Ein Singleton zu löschen und neu zu instanzieren wäre keine Singleton Ein Singleton ist ein "einzigartiges Objekt", dass heißt, dass auch nach seiner Existenz kein weiteres seiner Art existiert, wobei das eher eine Ausnahmesituation ist, weil ein Singleton eigentlich immer während der gesamten Laufzeit existiert.
Woher nimmst Du diese Erkenntnis? Wie gesagt, ich meine 'alle' Instanzen (genauer alle Referenzen auf die eine existierende Instanz).
nikosch ist offline   Mit Zitat antworten
Alt 26.07.2007, 01:47  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Also bis auf die call_user_func* Funktionen kenne ich sonst nurnoch Reflections:
http://de3.php.net/reflection#langua...flectionmethod
Vielleicht löst dessen Methode invoke() ja dein Vorhaben.

Reflections sind zweifellos mächtig, aber wofür sie eigentlich in PHP implementiert wurden:
Zitat:
Die ReflectionMethod Klasse erlaubt es, Klassenmethoden zurückzuentwickeln.
.. verstehe ich nicht. Vielleicht zwecks Quellcodeanalyse. Analysiere allerdings (noch) selten automatisiert meinen Quellcode. Hm.
Zergling-new ist offline   Mit Zitat antworten
Alt 26.07.2007, 01:55  
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

Stimmt, da hatte ich jetzt noch gar nicht dran gedacht. Obwohl ReflectionMethod::invoke() schon widder so aussieht, als könnte ich da erneut Bekanntschaft mit Herrn Nahasapeemapetilon äh.... mit dem T_PAAMAYIM_NEKUDOTAYIM machen :wink:
Mal sehen, ob ichs mir so kompliziert machen möchte über Reflections zu gehen.

EDIT:
Zitat:
Zitat von Zergling
Zitat:
Die ReflectionMethod Klasse erlaubt es, Klassenmethoden zurückzuentwickeln.
.. verstehe ich nicht.
Die Tiefen von Reflections habe ich auch noch nicht mal annähernd begonnen auszuloten.
nikosch ist offline   Mit Zitat antworten
Alt 26.07.2007, 01:55  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Hammer, Lange Diskussion und Zergling kommt mit nem Dreizeiler Und womöglich hat er nocht Recht

Zitat:
Zitat von nikosch77
Zitat:
Zitat von KingCrunch
Ein Singleton zu löschen und neu zu instanzieren wäre keine Singleton Ein Singleton ist ein "einzigartiges Objekt", dass heißt, dass auch nach seiner Existenz kein weiteres seiner Art existiert, wobei das eher eine Ausnahmesituation ist, weil ein Singleton eigentlich immer während der gesamten Laufzeit existiert.
Woher nimmst Du diese Erkenntnis? Wie gesagt, ich meine 'alle' Instanzen (genauer alle Referenzen auf die eine existierende Instanz).
Ein Singleton ist eine Instanz (wen interessieren da die Referenzen?). Ein Singleton existiert genau einmal. Eine weitere Instanzierung würde eine zweite Instanz bedeuten, wobei es egal ist, ob die alte nun hinüber ist, oder nicht (das interessiert der Zweiten sowieso nicht).

Naja, auf Zergling hören. Womöglich meinst du kein Singleton, aber es mag trotzdem sinnvoll sein.
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch 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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
t_paamayim_nekudotayim, php t_paamayim_nekudotayim, t_paamayim_nekudotayim php, was ist t_paamayim_nekudotayim, \t_paamayim_nekudotayim\, robo47 eval statisch, php t_paamayim_nekudotayim, g t_paamayim_nekudotayim, t_paamayim_nekudotayim auf deutsch, php eval singleton, php.net t_paamayim_nekudotayim, php reset singleton, php t_paamayim_nekudotayim static, php unexpected t_paamayim_nekudotayim, php this static t_paamayim_nekudotayim, t_paamayim_nekudotayim static class method, php5 t_paamayim_nekudotayim, php bug t_paamayim_nekudotayim, t_paamayim_nekudotayim,, singletoncache deutsch

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