PHP деструктор и связь с д ++ деструктором?

Мне трудно понять, что ДОЛЖНО быть сделано в деструкторе класса PHP

Я пришел с C ++.
В C ++, если у меня есть это:

class A{
int n;
~A(){
}
}

class A2{
int* n;
~A2(){
delete n;
}
}

Язык ЗНАЕТ, что если экземпляр выходит за рамки, его член N должны быть освобождены, потому что N принадлежит только этому самому экземпляру.
НО если экземпляр A2 выходит из области видимости, он не знает, указана ли память N должен быть освобожден (возможно, есть другие указатели, указывающие на ту же самую память)
НО, если мы уверены, что хотим освободить эту память, ЕСЛИ A2 Экземпляр выходит из области видимости, мы должны вручную «удалить» его, потому что это наше намерение.

Как насчет php?
Я новичок, и я видел несколько решений:

class A3{
private $n;
public function __destruct(){
//Choice 1
unset($this->$n);

//Choice 2
delete $this->$n;

//Choice 3

}
}

Я не уверен в разнице между unset и delete, но что угодно.
Мне сказали (см. Вариант 3), что PHP «самостоятельно» освобождает память, если мы ничего не делаем.
Но я тогда не понимаю использование удаления или сброса в деструкторе.
У нас нет понятия «указатель» в php, поэтому если экземпляр A3 выходит за рамки, естественно освободить N.

Итак, что-нибудь, что ДОЛЖНО быть сделано в деструкторе? Если нет, то в деструкторе никогда не используется delete или unset?

РЕДАКТИРОВАТЬ: переписать код на основе аксиального комментария

3

Решение

Что вы пишете в деструкторе в C ++?
Вы, вероятно, пишете операторы, высвобождающие ресурсы, приобретенные за время существования объекта, не так ли?

Это то же самое в PHP, но в большинстве случаев вам не нужно ничего помещать в деструктор, потому что интерпретатор автоматически собирает неиспользуемую память и ресурсы.

Однако рекомендуется высвобождать в деструкторе ресурсы, полученные в конструкторе (или во время жизни объекта), либо для того, чтобы убедиться, что используемая ими память освобождается ранее, либо в качестве документации: кто-то, кто читает деструктор и находит вызов в fclose() он знает, что в конструкторе или, возможно, в другом методе класса, вызов сопряжения с fopen() был выполнен, и обработчик был сохранен внутри объекта.


Постскриптум

  1. Линия $n от:

    class A3{
    $n
    public function __deconstruct(){
    

    это неверно. Должно заканчиваться точкой с запятой (;) и если целью является объявление свойства, то правильный синтаксис должен начинаться с одного из спецификаторов видимости (private, protected или же public), как это:

    class A3 {
    private $n;
    public function __destruct() {
    
  2. Название метода деструктора __destruct() и не __destructor(),

  3. Здесь нет delete в PHP: http://php.net/manual/en/function.delete.php.
    Ваш три варианта только один: выбор № 1 (unset($this->pdo);).

Узнайте больше о классы и объекты в PHP. Начните с того, что забыли большую часть того, что вы знаете из C ++, так как PHP OOP работает по-другому, и ваши знания C ++, вероятно, принесут больше вреда, чем пользы при изучении OOP в PHP.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]