Zugriff über statische Methoden

Moin,

kurze Frage:

Ich habe Singletons kreiert, über die ich wie folgt zugreifen kann:

$tmp=3DKLASSE::getInstance("Instancename");
echo $tmp->getValue();

Wieso geht dieser Aufruf nicht und wie könnte ich obigen Konstrukt
kürzer schreiben ohne die tmp Variable?

echo KLASSE::getInstance("Instancename")->getValue();

Vorschläge erwünscht...

Danke für Hilfe

Gruß
Anne
Rainer Hinz [ Do, 23 August 2007 22:48 ] [ ID #1803399 ]

Re: Zugriff über statische Methoden

Hallo Anne,

Anne Kaeppes schrieb:
> Ich habe Singletons kreiert, über die ich wie folgt zugreifen kann:
>
> $tmp=KLASSE::getInstance("Instancename");
> echo $tmp->getValue();
>
> Wieso geht dieser Aufruf nicht

Der Aufruf stimmt so. Kannst du mal den Quelltext von getInstance posten?
BTW das ist kein Singelton sondern ein Multiton. Singleton bedeutet,
dass es von dieser Klasse nur eine Instance geben kann.

> und wie könnte ich obigen Konstrukt
> kürzer schreiben ohne die tmp Variable?
>
> echo KLASSE::getInstance("Instancename")->getValue();

Das geht in PHP nicht. Ein vernünftiger Workaround fällt mir auch nicht
ein, aber was stört dich denn so daran es in zwei Zeilen mit
zusätzlicher Variable zu schreiben. Ich find das übersichtlicher.

mfg
Andreas
Andreas.Eberhoefer [ Do, 23 August 2007 22:39 ] [ ID #1803400 ]

Re: Zugriff über statische Methoden

Andreas Eberhöfer wrote:

> aber was stört dich denn so daran es in zwei Zeilen mit
> zusätzlicher Variable zu schreiben.

Die permanente Angst jemand sagt zu mir, dass es doch schon lange einen
Workaround gibt?

;-)

Gruß
Anne
Rainer Hinz [ Do, 23 August 2007 23:18 ] [ ID #1803401 ]

Re: Zugriff über statische Methoden

..oO(Andreas Eberhöfer)

>Anne Kaeppes schrieb:
>
>> echo KLASSE::getInstance("Instancename")->getValue();
>
>Das geht in PHP nicht.

In PHP 5 schon.

Micha
Michael Fesser [ Do, 23 August 2007 23:01 ] [ ID #1803403 ]

Re: Zugriff über statische Methoden

..oO(Anne Kaeppes)

>Ich habe Singletons kreiert, über die ich wie folgt zugreifen kann:
>
>$tmp=KLASSE::getInstance("Instancename");
>echo $tmp->getValue();
>
>Wieso geht dieser Aufruf nicht und wie könnte ich obigen Konstrukt
>kürzer schreiben ohne die tmp Variable?
>
>echo KLASSE::getInstance("Instancename")->getValue();

Genau so. Aber was geht denn nicht? Kommt 'ne Fehlermeldung?

Micha
Michael Fesser [ Do, 23 August 2007 23:02 ] [ ID #1803404 ]

Re: Zugriff über statische Methoden

Anne Kaeppes schrieb:
> Moin,
>
> kurze Frage:
>
> Ich habe Singletons kreiert, über die ich wie folgt zugreifen kann:
>
> $tmp=KLASSE::getInstance("Instancename");
> echo $tmp->getValue();
>
> Wieso geht dieser Aufruf nicht und wie könnte ich obigen Konstrukt
> kürzer schreiben ohne die tmp Variable?
>
> echo KLASSE::getInstance("Instancename")->getValue();
>
> Vorschläge erwünscht...

Evtl. möchtest du sowas?

public static function getInstValue($inst){
$tmp=self::getInstance($inst);
return $tmp->getValue();;
}

echo KLASSE::getInstValue("Instancename");


Bei vielen Eigenschaften ist das aber eher hässlich. Du könntest die
gewünschte Eigenschaft übergeben und dann per Reflection[1] den
gewünschten Getter aufrufen. Ist aber auch nicht umbedingt schön.


class thing {
private static $instance=array();
private $name=null;
public static function getInstance($name)
{
if (! array_key_exists($name,self::$instance))
{
self::$instance[$name] = new thing();
self::$instance[$name]->name='huhu from '.$name;
}
return self::$instance[$name];
}

private function __construct(){}

public function getName(){ return $this->name;}

public static function getPropperty($inst,$propp){
$method= new ReflectionMethod(get_class(), 'get'.ucwords($propp));
return $method->invoke(self::getInstance($inst)) ;;
}
}

echo thing::getPropperty("that","name");


[1] http://de3.php.net/manual/de/language.oop5.reflection.php
Harald Stowasser [ Fr, 24 August 2007 12:08 ] [ ID #1804308 ]

Re: Zugriff über statische Methoden

Harald Stowasser wrote:

> Evtl. möchtest du sowas?
>
> public static function getInstValue($inst){
> $tmp=self::getInstance($inst);
> return $tmp->getValue();;
> }
>
> echo KLASSE::getInstValue("Instancename");

Wieso Einfach wenns auch Kompliziert geht? Oder warum schreibst Du das?

Klasse::getInstance()->MethodOrField funktioniert, wie bereits Michael
schrieb in PHP5 wunderbar.

Ulf

--
_,
_(_p> Ulf [Kado] Kadner
\<_)
^^
Ulf Kadner [ Fr, 24 August 2007 12:37 ] [ ID #1804310 ]

Re: Zugriff über statische Methoden

Ulf Kadner schrieb:
> Harald Stowasser wrote:
>
>> Evtl. möchtest du sowas?
>>
>> public static function getInstValue($inst){
>> $tmp=self::getInstance($inst);
>> return $tmp->getValue();;
>> }
>>
>> echo KLASSE::getInstValue("Instancename");
>
> Wieso Einfach wenns auch Kompliziert geht? Oder warum schreibst Du das?

Es geht hier um das Maskieren von getValue in die Statische Funktion
getInstValue.

Ob dort
$tmp=self::getInstance($inst);
return $tmp->getValue();;
oder
$tmp=self::getInstance($inst)->getValue();
steht ist (mir vollkommen) egal!


Der relevante Unterschied ist:

KLASSE::getInstValue("Instancename");
oder
KLASSE::getInstance("Instancename")->getValue();
oder
KLASSE::getPropperty("Instancename","value");

Such Dir was aus, was Dir besser gefällt.
Harald Stowasser [ Fr, 24 August 2007 13:17 ] [ ID #1804311 ]

Re: Zugriff über statische Methoden

Harald Stowasser schrieb:

Sorry vereditiert:

> Ob dort
> $tmp=self::getInstance($inst);
> return $tmp->getValue();;
> oder
return self::getInstance($inst)->getValue();
> steht ist (mir vollkommen) egal!
Harald Stowasser [ Fr, 24 August 2007 13:32 ] [ ID #1804313 ]

Re: Zugriff über statische Methoden

Harald Stowasser wrote:

> Es geht hier um das Maskieren von getValue in die Statische Funktion
> getInstValue.

Warum sollte man das wollen? Implementiere __get und das Problem ist
gegessen.

> Der relevante Unterschied ist:
>
> KLASSE::getInstance("Instancename")->getValue();

Ist doch alles Murks. Besser:
KLASSE::getInstance('..')->Value;

Wobei dieses sogar noch eine echte Eigenschaft darstellt und nicht
direkt auf Felder zugreift. (__get() vorrausggesetzt natürlich)

> KLASSE::getPropperty("Instancename","value");

Arg... :-)

Ulf

--
_,
_(_p> Ulf [Kado] Kadner
\<_)
^^
Ulf Kadner [ Fr, 24 August 2007 14:02 ] [ ID #1804314 ]

Re: Zugriff über statische Methoden

Ulf Kadner schrieb:
> Harald Stowasser wrote:
>
>> Es geht hier um das Maskieren von getValue in die Statische Funktion
>> getInstValue.
>
> Warum sollte man das wollen? Implementiere __get und das Problem ist
> gegessen.

__get() kann nicht statisch sein!

>> Der relevante Unterschied ist:
>>
>> KLASSE::getInstance("Instancename")->getValue();
>
> Ist doch alles Murks. Besser:
> KLASSE::getInstance('..')->Value;

Ob es Murks ist oder nicht lässt du besser mal den Designer der
Schnittstelle zu einem Objekt entscheiden.

Sei es ob man ein Interface bedienen muss, oder ob man nur dem
Template-Designer aka Snowboarde^WwebDesigner eine einfachere
Zugriffsmöglichkeit zu einer Komposition bieten will.

Smarty z.B. ist extrem Allergisch auf ein $var->func()->func()
konstrukt. [1] Ja auch in PHP5+.


[1]http://www.phpinsider.com/smarty-forum/viewtopic.php?t=11 572&highlight=object
Harald Stowasser [ Fr, 24 August 2007 14:23 ] [ ID #1804316 ]

Re: Zugriff über statische Methoden

Harald Stowasser wrote:

> __get() kann nicht statisch sein!

Das hat auch keiner behauptet.

> Ob es Murks ist oder nicht lässt du besser mal den Designer der
> Schnittstelle zu einem Objekt entscheiden.

Da haste rechte.

> Smarty z.B. ist extrem Allergisch auf ein $var->func()->func()
> konstrukt. [1] Ja auch in PHP5+.

Als wär Smarty in irgend einer Hinsicht ein Maßstab.

Ulf

--
_,
_(_p> Ulf [Kado] Kadner
\<_)
^^
Ulf Kadner [ Fr, 24 August 2007 17:37 ] [ ID #1804317 ]

Re: Zugriff über statische Methoden

Ulf Kadner wrote:
> Harald Stowasser wrote:
>> Smarty z.B. ist extrem Allergisch auf ein $var->func()->func()
>> konstrukt. [1] Ja auch in PHP5+.
>
> Als wär Smarty in irgend einer Hinsicht ein Maßstab.

Gibt es etwas Besseres? Die Frage ist ernst gemeint.


--
[FrontPage] Dann wechsle schnellstens zu Notpatsch.echse, dann mußt Du
alle Buchstaben selber eingeben und Dir auch bei jedem überlegen, ob der
dahingehört bzw. weggelassen werden kann.
(Georg Maaß in dcljs <b57nm8$25hka6$1 [at] ID-3551.news.dfncis.de>)
PointedEars [ Mo, 27 August 2007 04:11 ] [ ID #1806352 ]

Re: Zugriff über statische Methoden

Thomas 'PointedEars' Lahn schrieb:
> Ulf Kadner wrote:
>> Harald Stowasser wrote:
>>> Smarty z.B. ist extrem Allergisch auf ein $var->func()->func()
>>> konstrukt. [1] Ja auch in PHP5+.
>> Als wär Smarty in irgend einer Hinsicht ein Maßstab.
>
> Gibt es etwas Besseres? Die Frage ist ernst gemeint.

Sollte sie ernst gemeint sein, fehlt darunter die Liste deiner
Anforderungen. Es gibt viele[tm] Templateengines. Und die meisten haben
unterschiedliche Ziele.
Ich habe früher immer vLibTemplate benutzt. Die ist sehr schlank,
schnell und erstellt dein Template mit genau einem PCRE-Call. Smarty
hingegen ersetzt die Smartytags durch die entsprechenden PHP-Befehle.
Danach habe ich eine selbst erstellte Engine verwendet, die auf XML und
XSLT basierte und mehr als nur HTML-Seiten erstellen konnte.
Da das zwar wunderbar funktioniert hat, aber spätestens dem HTMLer
Kopfzerbrechen bereitet hat, bin ich davon häufig wieder abgerückt.
Momentan verwende ich mal wieder einen Eigenbau - dieser holt aber mehr
Programmiertechnik ins Template, da man im Template selbst alle
benötigten Daten anfordert, um die Logik gänzlich vom Template zu
entkoppeln.

Gruß,
Torsten
thorny [ Mo, 27 August 2007 09:02 ] [ ID #1806354 ]

Re: Zugriff über statische Methoden

Thomas 'PointedEars' Lahn wrote:

>> Als wär Smarty in irgend einer Hinsicht ein Maßstab.
>
> Gibt es etwas Besseres? Die Frage ist ernst gemeint.

Naja was besseres ist halt, wie Thosten bereits schrieb, relativ. Ich
sehe Smarty deswegen nicht als Maßstab für irgendwas, da es einfachmal
total oversized ist (über 300kb) um Templating zu nutzen. Saubere
Trennung von Code und Layout ist damit sicher auch möglich aber wenn man
nur daß will nutzt man vieleicht 1/20 dessen was es hergibt. Als reine
Templateengine würde ich das schojn lange nicht mehr bezeichnen.

Also ich persöhnlich kenne keinen prof. PHP-Entwickler der Smarty
freiwillig/gerne nutzt. OK, wer PHP-Documentor gern anwendet kommt um
Smarty nicht herum (baut darauf auf).

Für reine Template-Zwecke hab ich mir mal selbst ne Engine gebaut (28kb
wovon die Hälfte Kommentare sind), die sich aufs wesentliche beschränkt
und syntaktisch zu meinen Vorstellungen past. Allerdings würde ich auch
die nicht als Maßstab bezeichnen. Mehr brauch ich einfach nicht.

Es gibt sicher einige gute Projekte, welche durchaus das Zeug dazu haben
als Maßstab heran gezogen zu werden. So auf Anhieb fällt mir PatTemplate
ein. Das ist sehr ordentlich programmiert und kann eigentlich alles
notwendige + nen bischen Kram mehr.

--
_,
_(_p> Ulf [Kado] Kadner
\<_)
^^
Ulf Kadner [ Mo, 27 August 2007 16:57 ] [ ID #1806371 ]
PHP » de.comp.lang.php.misc » Zugriff über statische Methoden

Vorheriges Thema: utf-8 und Mailformular
Nächstes Thema: Skript zur Dateitypänderung