@Vladimir-Hetman

Аналог unset в ООП?

Прочитав доки про деструктор я понял, что деструктор это аналог unset().
Затем, я решил свой код ООП переписать на процедурный стиль.

Правильно ли я переписал свой код?
И верно ли, что деструктор это аналог unset() ?

Решил этот код ООП:
class User {

public $name = "Bankai", $age = 40;

function show(){
echo "$this->name:$this->age <br>";
}

function __destruct(){
echo "Деструктор";
}
};

$obj = new User();
$obj->show();


Переписать на процедурный, знаю, что криво написал:
$fun = function($name1, $age1){
echo "$name1 $age1 <br>";
echo "Деструктор";
};

$fun("Bankai", 40);
unset($fun);
  • Вопрос задан
  • 176 просмотров
Решения вопроса 3
AleksandrB
@AleksandrB
Совсем недавно вывел "Hello world"
Вы неверно поняли.
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"


Освобождение ссылок на переменную не означает вызов деструктора так как ссылка объект может быть еще в других переменных.

Деструктор невозможно переписать в процедурном стиле, это чисто объектное поведение.
Ответ написан
@humoured
Вы всё на свете найдёте в коробке с карандашами
деструктор это аналог unset()
Деструктор — функция, которая вызывается при уничтожении объекта. В ней можно, например, сохранить текущее состояние куда-нибудь. Она будет исполнена при вызове unset().

$fun = function($name1, $age1){
echo "$name1 $age1 <br>";
echo "Деструктор";
};
Это не деструктор. Это вывод строки. Никакого отношения unset($fun); (уничтожение значения переменной) к выводу строки и выполнению кода лямбда-функции не имеет.
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Код переписан абсолютно неверно.
Конструктор - это не просто вызов функции. В результате его работы создаётся и инициализируется экземпляр класса.
Деструктор может выполнять действия, связанные с удалением экземпляра, например освобождение памяти, закрытие файлов, освобождение дескрипторов и т.д.
Переписать ООП в процедурный код можно примерно так:
spoiler
function createUser(): object
{
    return (object)[
        'name' => 'Bankai',
        'age' => 40,
    ];
}

function showUser(object $user): void
{
    printf('%s : %s<br>', $user->name, $user->age);
}

function clearUser(object &$user): void
{
    echo "Деструктор";
    $user = null;
}

$user = createUser();
showUser($user);
clearUser($user);
unset($user);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽