Вы неверно поняли.
Unset - удаляет переменную
__destruct выполняется когда все ссылки на переменную освобождены
<?php
class User {
public $name = "Bankai", $age = 40;
function show(){
echo "$this->name:$this->age <br>\n";
}
function __destruct(){
echo "Деструктор \n";
}
};
$obj = new User();
$obj->show();
$obj2 = $obj;
unset($obj2);
var_dump("__destruct not calling");
unset($obj);
var_dump("__destruct called");
Результат:
Bankai:40 <br>
string(22) "__destruct not calling"
Деструктор
string(21) "__destruct called"
Освобождение ссылок на переменную не означает вызов деструктора так как ссылка объект может быть еще в других переменных.
Деструктор невозможно переписать в процедурном стиле, это чисто объектное поведение.