|
|
|
|
<?
error_reporting(E_ALL);
class Class_1{
public function __construct($n){
echo $n.'. Создан объект "', __CLASS__, '"<br />';
}
public function __destruct(){
echo '1. Объект "', __CLASS__, '" удален.<br />';
}
}
class Class_2 {
public function __construct($n){
echo $n.'. Создан объект "', __CLASS__, '"<br />';
}
public function __destruct(){
echo '2. Объект "', __CLASS__, '" удален.<br />';
}
}
class Class_3 {
public function __construct($n){
echo $n.'. Создан объект "', __CLASS__, '"<br />';
}
public function __destruct(){
echo '3. Объект "', __CLASS__, '" удален.<br />';
}
}
$obj_1 = new Class_1(1);
$obj_2 = new Class_2(2);
$obj_3 = new Class_3(3);
|
выводит
3. Объект "Class_3" удален.
2. Объект "Class_2" удален.
1. Объект "Class_1" удален.
|
а почему не как в процедуре
1. Объект "Class_1" удален.
2. Объект "Class_2" удален.
3. Объект "Class_3" удален.
|
| |
|
|
|
|
|
|
|
для: oliss
(29.07.2010 в 10:34)
| | видимо это принцип стека (LIFO) | |
|
|
|
|
|
|
|
для: psychomc
(29.07.2010 в 11:15)
| | Очень странное поведение ...меняем порядок
$obj_3 = new Class_3(3);
$obj_2 = new Class_2(2);
$obj_1 = new Class_1(1);
|
на выходе
3. Создан объект "Class_3"
2. Создан объект "Class_2"
1. Создан объект "Class_1"
|
1. Объект "Class_1" удален.
2. Объект "Class_2" удален.
3. Объект "Class_3" удален.
|
Совершенно не понятна логика этого стека | |
|
|
|
|
|
|
|
для: oliss
(29.07.2010 в 11:43)
| | Посмотрите на картинку справа
Не берусь утверждать, но предположить, что сборщик мусора будет удалять именно в обратном порядке (т.к. последний созданный объект окажется первым в стеке) это логично.
Вот если вы сделаете, например, так:
unset($obj_1);
unset($obj_2);
unset($obj_3);
или даже так
unset($obj_1, $obj_2, $obj_3);
то скорее всего добьетесь того, чего пытаетесь добиться. Т.е. если вам нужно правильно выполнение __destruct() то и выполнять его лучше относительно явно (ручным удалением объекта), я думаю | |
|
|
|
|
|
|
|
для: neadekvat
(29.07.2010 в 12:06)
| | Сейчас буду разбираться
Есть ещё непонятное
<?
error_reporting(E_ALL);
class Class_1{
public function __construct($n){
$this->n = $n;
}
public function __destruct(){
echo '1. Объект "', __CLASS__, '" удален.<br />';
}
function display(){
echo $this->n.'. Создан объект "', __CLASS__, '"<br />';
}
public $varr = 'Свойство [ переменная ]';
}
$obj_1 = new Class_1(1);
$obj_1 -> display();
echo $obj_1 -> varr;
|
выводит
1. Создан объект "Class_1"
Свойство [ переменная ]
1. Объект "Class_1" удален.
|
но деструктор вызывается перед самым уничтожением класса.
те по идее данная конструкция не должна работать (выброс нотайсов) тк деструктор вызывается не в конце класса,а она прекрасно работает
почему ? В чём тут нюанс? | |
|
|
|
|
|
|
|
для: oliss
(29.07.2010 в 12:34)
| | По-моему, нет разницы, в каком порядке объявляются члены и методы класса. Просто принятно члены объявлять до всех методов, конструктор объявлять первым, а дестркутор последним.
И кстати уничтожается не класс, а объект класса | |
|
|
|
|
|
|
|
для: neadekvat
(29.07.2010 в 12:38)
| | Тогда не понятно зачем вообще нужен деструктор в классе ,когда можно явно разрушить ( удалить из памяти ) объект с помощью unset($obj_1); | |
|
|
|
|
|
|
|
для: oliss
(29.07.2010 в 12:47)
| | Хм, ну, если грубо - например, класс реализует работу с файлами. Конструктор будет открывать дескриптор, а деструктор - закрывать.
То есть деструктор нужен не для того, чтобы удалить объект (он удалиться в любом случаи), а для того, чтобы выполнить какие-то действия перед удалением. | |
|
|
|
|
|
|
|
для: oliss
(29.07.2010 в 12:47)
| | чтобы не делать явный вызов какого-либо метода,который должен выполниться по завершению работы скрипта | |
|
|
|