Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469

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

06.01.2023, 10:49. Показов 3887. Ответов 56
Метки нет (Все метки)

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

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


Решил этот код ООП:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class User {
 
public $name = "Bankai", $age = 40;
 
function show(){
echo "$this->name:$this->age <br>";
}
 
function __destruct(){
echo "Деструктор";
}
};
 
$obj = new User();
$obj->show();

Переписать на процедурный, знаю, что криво написал:
PHP
1
2
3
4
5
6
7
$fun = function($name1, $age1){
echo "$name1 $age1 <br>";
echo "Деструктор";
};
 
$fun("Bankai", 40);
unset($fun);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2023, 10:49
Ответы с готовыми решениями:

unset
Есть функция в которой посредством rand выбирается 1 баскетбольная команда из двумерного массива и также 2 комманда выглядит это так ...

unset
есть ли смысл применять unset если переменная заменяет значение в цикле? к примеру while(){ $a=.. /*присваиваем какоето значение к...

unset и массив
Здравствуйте уважаемые!:). Возникла проблема с массивом. Пусть у меня есть массив из чисел от 1 до 10 ,размер массива 20,мне надо удалить...

56
Невнимательный
 Аватар для ft4l
3139 / 1337 / 362
Регистрация: 08.02.2013
Сообщений: 7,840
Записей в блоге: 2
08.01.2023, 12:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Объект (в широком смылсе) будет удалён, когда число ссылающихся на него ссылок станет равным 0.
Этот момент не так просто описать словами
например
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
class A {
    function __construct(){
        echo "HTML\n";
    }
    function __destruct(){
        echo "/HTML\n";
    }
}
class B {
    function __construct(){
        echo "  BODY\n";
    }
    function __destruct(){
        echo "  /BODY\n";
    }
}
 
register_shutdown_function(function(){ echo "GC\n"; });
 
$a = new A();
$b = new B();
echo phpversion(), "\n";
exit;
Windows Batch file
1
2
3
4
5
6
7
  php .\test.php
HTML
        BODY
5.4.45
GC
        /BODY
/HTML
похоже на то что деструкторы выполняются после общего завершения выполнения,
в порядке обратном созданию объектов

Добавлено через 4 минуты
unset() это да ))
PHP
1
2
3
$a = new A();
unset($a);
$b = new B();
Windows Batch file
1
2
3
4
5
6
7
  php .\test.php
HTML
/HTML
        BODY
5.4.45
GC
        /BODY
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.01.2023, 12:18
Цитата Сообщение от ft4l Посмотреть сообщение
похоже на то что деструкторы выполняются после общего завершения выполнения,
в порядке обратномсозданию объектов
порядок выполнения деструкторов не гарантируется
https://www.php.net/manual/ru/... destructor
1
Невнимательный
 Аватар для ft4l
3139 / 1337 / 362
Регистрация: 08.02.2013
Сообщений: 7,840
Записей в блоге: 2
08.01.2023, 12:24
Цитата Сообщение от Jewbacabra Посмотреть сообщение
порядок выполнения деструкторов не гарантируется
Это есть в доках ,) но пока не сталкивался с лично другим поведением... хотя 8.+ особо не осваивал
// ... хотя там и насчёт разных SAPI есть моменты
... так-что да надёжнее не полагаться на такое ... если хочется не сильно
0
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
08.01.2023, 13:04  [ТС]
Jewbacabra
А кто-то сказал что ничего не делает?
Вы же сказали:
1) Вызывается автоматически - да
2) Очищает "память или что-то там" - нет
Как я понял, деструктор сам по себе вызывается, то есть автоматически(неявно).
Деструктор вызывается автоматически после уничтожения класса и ничего не делает, верно?
Но мы можем вызвать деструктор явно и написать туда инструкции.

Добавлено через 4 минуты
estic
Да я запутался, одни мне говорят, что деструктор вызывается автоматически(неявно) и очищает память.
Другие говорят, что деструктор вызывается так же автоматически(неявно) и ничего не делает.
Я запутался.

Если мы не вызываем деструктор явно, то он вызывается сам и ничего не делает, то какая в этом логика?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.01.2023, 13:17
Цитата Сообщение от G_manX Посмотреть сообщение
Вы же сказали:
1) Вызывается автоматически - да
2) Очищает "память или что-то там" - нет
Не вижу тут слов "ничего не делает"
И если уж цитировать, то до конца
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Деструктор - это просто возможность выполнить пользовательский код при удалении объекта
0
1306 / 781 / 190
Регистрация: 19.09.2020
Сообщений: 1,993
09.01.2023, 08:33
Цитата Сообщение от ft4l Посмотреть сообщение
похоже на то что деструкторы выполняются после общего завершения выполнения,
Так я уже цитировал доку

Деструктор будет вызван при освобождении всех ссылок на определённый объект или при завершении скрипта (порядок выполнения деструкторов не гарантируется).
1
2 / 2 / 0
Регистрация: 15.02.2022
Сообщений: 469
11.01.2023, 17:52  [ТС]
KingdaKa
Деструктор будет вызван при освобождении всех ссылок на определённый объект или при завершении скрипта (порядок выполнения деструкторов не гарантируется).
то есть, сам по себе(автоматически, неявно) деструктор не вызывается?
если мы его не пропишем в классе?
0
-8 / 8 / 0
Регистрация: 31.08.2022
Сообщений: 209
11.01.2023, 19:11
PHP
1
2
3
4
5
6
7
8
9
var_dump(memory_get_usage()); // 400384
 
$a = 1;
 
var_dump(memory_get_usage()); // 400416
 
unset($a);
 
var_dump(memory_get_usage()); // 400416
как видим после unset($a) для переменной $a продолжает выделяться память
0
321 / 189 / 78
Регистрация: 04.10.2016
Сообщений: 809
18.01.2023, 17:45
Цитата Сообщение от Vily Vykidnye Посмотреть сообщение
как видим после unset($a) для переменной $a продолжает выделяться память
да неужели?


PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$a = 1;
var_dump($a); 
unset($a);
 
var_dump(memory_get_usage()); //400584
 
$a = 1;
 
var_dump(memory_get_usage()); //400584
 
unset($a); 
 
var_dump(memory_get_usage()); //400584
0
-8 / 8 / 0
Регистрация: 31.08.2022
Сообщений: 209
19.01.2023, 15:19
Цитата Сообщение от Fart83 Посмотреть сообщение
да неужели?
ужели
Миниатюры
Аналог unset в ООП?  
0
321 / 189 / 78
Регистрация: 04.10.2016
Сообщений: 809
19.01.2023, 15:24
Цитата Сообщение от Vily Vykidnye Посмотреть сообщение
ужели
и что?))) память не изменилась 401024. память была очищена из переменной $a. вы даже не удосужились написать пример корректный, ибо вы его не понимаете ни разу
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,845
19.01.2023, 15:37
Цитата Сообщение от G_manX Посмотреть сообщение
то есть, сам по себе(автоматически, неявно) деструктор не вызывается?
Он вызывается при уничножении объекта. Объект может быть уничтожет 2мя способами.
1, явным unset()
2. когда завершится скрипт и все объекты будут уничтожены автоматически

Добавлено через 3 минуты
Пожалуй еще третим способом, например когда объект не сохранен и ипользований временного объекта больше нет
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
 
class A
{
    public function __destruct()
    {
        echo 'A destructed', PHP_EOL;
    }
}
 
function b(A $obj){
 
}
 
echo 'start', PHP_EOL;
b(new A());
echo 'finish', PHP_EOL;
0
-8 / 8 / 0
Регистрация: 31.08.2022
Сообщений: 209
19.01.2023, 15:48
Цитата Сообщение от Fart83 Посмотреть сообщение
и что?))) память не изменилась 401024
памяти было 400992, нужно быть внимательнее
0
321 / 189 / 78
Регистрация: 04.10.2016
Сообщений: 809
19.01.2023, 16:01
Цитата Сообщение от Vily Vykidnye Посмотреть сообщение
памяти было 400992
было до основного момента?

Цитата Сообщение от Vily Vykidnye Посмотреть сообщение
памяти было 400992, нужно быть внимательнее
вам бы для начала почитать первоисточник, в котором указан пример с очисткой памяти перед тем, как пытать что то объяснить.

а на такой пример что ответите?

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$a = str_repeat("*", 1);
var_dump($a); 
unset($a);
 
var_dump(memory_get_usage()); //401096
 
$b = str_repeat("*", 1000);
 
var_dump(memory_get_usage()); //402376
 
unset($b); 
 
var_dump(memory_get_usage()); //401096
изучайте
0
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
19.01.2023, 17:21
Vily Vykidnye, когда говорят, что unset освобождает память, это вовсе не означает, что память сразу же возвращается системе. Она может оставаться в резерве, быть повторно использована PHP, возвращена системе после освобождения каких-то смежных областей, чтобы получился один более крупный участок, и т.п.

Добавлено через 9 минут
Внутри приложения обычно происходит то же самое, пока не исчерпан первоначально доступный блок памяти.
0
-8 / 8 / 0
Регистрация: 31.08.2022
Сообщений: 209
19.01.2023, 21:14
Phantom-84, что я и указал

Цитата Сообщение от Fart83 Посмотреть сообщение
а на такой пример что ответите?
отвечу, что ты фокусник, включил дурака и упорно не делаешь замер первоначального состояния

изучай
Миниатюры
Аналог unset в ООП?  
0
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
20.01.2023, 00:05
Цитата Сообщение от Vily Vykidnye Посмотреть сообщение
включил дурака и упорно не делаешь замер первоначального состояния
так вы точно так же не замечаете его пример

Сведите оба примера вместе. Сразу будет понятно, что многое зависит от объема переменной. Освобождение небольших переменных PHP вполне может не показывать. Возможно, это какая-то освободившаяся ячейка в таблице переменных. Зато после освобождения объемной переменной может произойти полный откат к предыдущему показателю занятости памяти.

Добавлено через 6 минут
Кстати, интересный случай, когда сразу большая переменная создается и освобождается. У меня так:
375616
376672
375648

Как видно, почти все откатилось обратно за вычетом 32 байт. Возможно, эти 32 байта - и есть размер ячейки в таблице переменных. В вашем примере с числовой переменной была такая же разница после создания переменной:
400384
400416

Добавлено через 4 минут
Еще одно подтверждение моей гипотезы, когда сначала создается и освобождается объемная (строковая) переменная, потом числовая:
376272
377328
376304
376304
376304

Даже после создания числовой переменной показатель не изменился - вполне возможно, что была задействована освободившаяся ранее "грязная" ячейка таблицы переменных.
0
-8 / 8 / 0
Регистрация: 31.08.2022
Сообщений: 209
20.01.2023, 13:28
Цитата Сообщение от Phantom-84 Посмотреть сообщение
так вы точно так же не замечаете его пример
там нет примера, там фокус - он не замеряет первоначальное состояние памяти и вардампит уже выделенную, которая никак не меняется и не должна меняться по unset, то есть он занимает память, потом делает unset у него вардамп показывает ПЕРВОНАЧАЛЬНАЯ ПАМЯТЬ + выделенная для переменной, потом он под выделенную для переменной память даёт значение, опять делает unset и у него опять то же самое значение памяти, НО он не замерил память ДО того, как переменную завёл

в п. 28 дано чётко, как это выглядит, могу продублировать популярнее
Миниатюры
Аналог unset в ООП?  
0
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
20.01.2023, 14:30
Vily Vykidnye, не хотите замечать элементарные вещи, ваше дело. Делаю последнюю попытку вам объяснить. Во-первых, в моих примерах ПЕРВОНАЧАЛЬНАЯ ПАМЯТЬ замеряется. Во-вторых, посмотрите на его второй пример. Да, он опять скрыл неосвобождение (или неполное освобождение) памяти небольшой, на этот раз строковой, переменной, но зато показал вот это для объемной переменной:
401096
402376
401096

Полный откат. Возможно, не откатился к первоначальному показателю небольшой участок размером, например, 32 байта. Т.е. первоначальный показатель мог быть, например, таким:
401064

Иными словами, в какой-то мере вы тоже правы. Но в общем unset освобождает память, просто PHP может не показывать освобождение небольших участков, о чем я уже писал!
1
3061 / 1463 / 265
Регистрация: 16.03.2008
Сообщений: 6,510
Записей в блоге: 2
20.01.2023, 15:02
memory_get_usage() вообще "забавная" штука и нужно понимать, что показывает

Недавно занимался оптимизацией. И так же натолкнулся на поведение, которое на первый взгляд странным показалось

Псевдокод теста

PHP
1
2
3
4
5
6
7
8
9
10
11
// заполняем массив значениями для входных параметров конструктора
// много вариантов, практически рандомные значения int 
$params = fillDataArray();
array_walk($params,static function(array $props) {
    $before = memory_get_usage();
    // Ни каких сайдэффектов в конструкторе нет
    $obj = new A(...$props);
    $obj->calc(); // просто вычисления
    unset($obj);
    echo  memory_get_usage() - $before, PHP_EOL;
});
При таком "раскладе" иногда выводилось отрицательное значение.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.01.2023, 15:02

Повсюду unset
Стоит ли применять unset везде где только можно? В смысле следует ли сразу после использования удалять все переменные по коду с помощью...

классы и unset
В теории, возможно ли реализовать класс, объект которого нельзя удалить через unset?

Unset в PHP
Доброго всем времени суток! Копаясь в легаси заметил что там частенько используется функция unset для удаления массивов или объектов, при...

Unset & return
Здравствуйте. На данный момент в пользовательских функциях у меня удаление ненужных переменных происходит перед возвратом значения: ...

Сессия восстанавливается после unset
Есть код в файле темы functions.php: add_action( 'init', 'do_session_start' ); function do_session_start() { if (...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru