- var_dump: documentation ( source)
- mt_rand: documentation ( source)
<?php
//$in2 = Closure::bind(function () {$this->ruler = 'jesus';}, $inst, get_class($inst));
class Singleton {
protected static $instance; // object instance
private function __construct(){ /* ... @return Singleton */ } // Защищаем от создания через new Singleton
private function __clone() { /* ... @return Singleton */ } // Защищаем от создания через клонирование
private function __wakeup() { /* ... @return Singleton */ } // Защищаем от создания через unserialize
public static function getInstance() { // Возвращает единственный экземпляр класса. @return Singleton
if ( !isset(self::$instance) ) {
$class = __CLASS__;
self::$instance = new $class();
self::$instance->id = mt_rand(1,1000);
}
return self::$instance;
}
public function doAction() { echo $this->id; }
}
$singy = Singleton::getInstance();
$singy->doAction();
$singy2 = Singleton::getInstance();
var_dump($singy, $singy2);
$derp = Closure::bind(function () {$fake = new Singleton(); $fake->id='hacked'; return $fake;}, $singy2, get_class($singy2));
$singy2 = $derp();
$singy2->doAction();
$singy->doAction();
var_dump($singy, $singy2);