Нельзя вызвать __destruct объекта. Он вызывается автоматически, когда сборщик мусора определяет, что этот объект больше никому не нужен (не осталось ссылок на него)
Если ты скажешь: "Но ...?", отвечу: "А что делать тем, кто этим объектом уже пользуется?"
class SelfDestructible
{
public $myname;
function __construct($myname)
{
$this->myname = $myname;
}
}
$a = new SelfDestructible('#1');
// Эта конструция буквально означает следующее:
// 1. выделить область памяти под объект '#1'
// 2. поместить в переменную $a адрес этой области памяти
// Иначе говоря, в переменной $a хранится указатель на объект
$b = new SelfDestructible('#2');
// Согласно твоей логике, тут должна была бы освободиться память, выделенная ранее под объект '#1'
// но как же поступить с переменной $a, которая всё ещё хранит адрес области памяти этого объекта
// И через переменную $a можно обратиться к той области памяти.
// То есть вломиться в склеп, где лежат останки безвременно погибшего объекта '#1' и бесчестно
// надругаться над ним
// Ни один язык такое кощунство и вандализм не позволит
P.S. поправка под уточнёный вопрос
class SingleSingleton
{
/**
* приватный - чтобы никто не делал new SingleSingleton
*/
private function __construct()
{
}
/**
* @return static
*/
public static function getInstance()
{
static $instatiated; // признак, что ещё не делали экземпляр класса
if (is_null($instatiated)) // если ещё не делали экземпляр класса
{
$instatiated = true; // пометить, что теперь сделали
return new SingleSingleton; // вернуть новый объектт
// метод getInstance может делать new SingleSingleton потому что находится в том же классе
}
else // уже был создан объект
{
return null; // вернуть ничего
}
}
}
// первый получит объект
$a = SingleSingleton::getInstance();
var_dump($a); // -> object(SingleSingleton)#1 {}
// второй получит ничего
$b = SingleSingleton::getInstance();
var_dump($b); // -> NULL
// а сделать new SingleSingleton нельзя
$c = new SingleSingleton; // -> PHP Fatal error