Static Verständnis Problem

dg87

Erfahrenes Mitglied
Moin,

ich dachte immer Static wäre u.a. dafür da, dass man zB eine statische Methode aufrufen kann, ohne eine Klasse zu instanzieren.
Da ich gerade mir Design Pattern ein bisschen durchlesen, bin ich auf folgendes gestoßen:

http://www.php2all.de/tutorialpage-31-singleton-immer-nur-eines.html

Ich versteh nicht, warum man hier die Variable $objects statisch macht.
Unten wird sie so aufgerufen:
Code:
Singleton::$objects[$class_name] = & Factory::get( $class_name, $params );

Kann ich nicht auch die Variable normal definnieren und mit $this aufrufen. Was bringt das? Ich glaub ich hab das Prinzip von static noch nicht ganz verstanden?

Wäre nett für kurze Hilfe

PS: Zudem versteh ich nicht warum in der genannten Zeile ein & Operator da steht nach der Zuweisung. Sorry dass ich so blöd frage
 
Sorry, aber das ist totaler Quatsch. Das ist kein Singleton im Sinne des Design-Patterns.

Bei einem Singleton hat man einen privaten Constructor, eine private statische Instanz-Member-Variable und eine public getInstance()-Methode. So wie es dort implementiert ist, ist das definitiv verwirrend. Ein Singleton kennt außerdem nur eine Instanz und die muss von sich selbst sein.

Außerdem kann der Code mit PHP 5.x (getestet mit 5.3) gar nicht funktionieren. Der Zugriff auf private Member einer Klasse von extern (bspw. globaler Scope) ist verboten. Folgendes Beispiel einfach mal ausprobieren:

singleton.php:
PHP:
<?php
class Singleton
{
	private static $_instance;
	
	private $user;
	
	private function __construct()
	{
		$this->user = 'Anyone';
	}
	
	public static function getInstance()
	{
		if(self::$_instance==null)
		{
			self::$_instance = new self();
		}
		
		assert(is_a(self::$_instance, 'Singleton'));
		
		return self::$_instance;
	}
	
	public function hello()
	{
		echo "Hello " . $this->user;
	}
}

Singleton::getInstance()->hello();

Singleton::$_instance = new stdClass();

// Zum testen auch noch das (Zeile oberhalb auskommentieren):
echo Singleton::getInstance()->user;

Singleton::getInstance()->hello();

Resultat:

Code:
Fatal error: Cannot access private property Singleton::$_instance in singleton.php on line 33

bzw.

Code:
Fatal error: Cannot access private property Singleton::$user in singleton.php on line 36

Edit:
Um deine Frage zu beantworten: Statische Variablen sind zwar nur innerhalb des Scopes verfügbar, in dem sie definiert wurden, aber sie behalten ihren Wert auch, wenn der Scope verlassen wird. Das bedeutet, das beim zweiten Call (der erste ist für eine Initialisierung notwenig) den bereits bestehenden Wert zurückgeben wird. Daher funktioniert das folgende Beispiel:

PHP:
function test_static_vars()
{
  static $var = 0;
  echo $var . "<br/>";
  $var++;
}

test_static_vars(); // gibt 0 aus
test_static_vars(); // gibt 1 aus
test_static_vars(); // gibt 2 aus, usw...

Kurz: Statisch definierte Vars behalten ihren Value selbst wenn der Scope verlassen wird, in dem sie definiert wurden.
 
Zuletzt bearbeitet:
Zurück