Hai,
Wenn ich eine normale dynamische Klasse habe, kann ich die mittels unset($klassenvariable) wieder zerstören. Wie muss ich das denn bei einer Singleton-Klasse machen? Die bleibt von dem unset($singletonclass) unbeindruckt.
Es ist nicht moeglich eine statische Variable zu zerstoeren. Man kann lediglich die Referenz innerhalb des aktuellen Kontextes zerstoeren. Ein darauffolgendes static Statement stellt die Referenz automatisch wieder her.
Und in unserem Beispiel wird die Singleton-Instanz in einer statischen Variable gehalten - von daher kann sie nicht zerstoert werden. (1)
MfG,
Sympatisant
(1) Beispiel:
<?php
class Singleton
{
static $Instance;
protected $myvar;
// private constructor
private function __construct( ) {
$this->myvar = 'Hello World';
}
// static singleton method
public function GetInstance( )
{
if( !isset( self::$Instance ) )
self::$Instance = new Singleton();
return self::$Instance;
}
// Example: unset()
// ! Throws Exception !
public static function DeleteMe( )
{
// Fatal error: Attempt to unset static property Singleton::$Instance in [..]
unset( self::$Instance );
}
// Edit Output-String
public function SetValue( $str )
{
$this->myvar = $str;
}
// Echo String
public function Debug()
{
echo $this->myvar.'<br>';
}
// Example: Desctructor
public function __destruct()
{
unset( $this->myvar );
}
}
// Get Instance
$Singleton = Singleton::GetInstance();
// Output String
echo $Singleton->Debug();
// Set individual Value
$Singleton->SetValue('Good Bye my World');
// Output String
echo $Singleton->Debug();
// Try to destroy Singleton-Static-Instance.. will Fail!
// $Singleton->DeleteMe();
// Do it manually
unset( $Singleton ); // Hier wird nur die Referenz geloescht, nicht die Static-Instanz
// Get "new" Instance - will still be the Same.
$Singleton = Singleton::GetInstance();
// Output String
echo $Singleton->Debug();
?>
--
"If the future isn't bright, at least it is colorful"
"If the future isn't bright, at least it is colorful"