php - отключить $это

Я сделал класс, который действует как оболочка файла. Когда пользователь вызывает метод удаления, я хочу сбросить объект (фактически $this). Есть ли способ (обходной путь) сделать это? В мануале сказано, что нельзя...


person thomas    schedule 13.10.2010    source источник
comment
Не могли бы вы предоставить код, где вы хотите вызвать это? Ваш вопрос очень неясен без контекста   -  person thomaux    schedule 13.10.2010
comment
Вам действительно НУЖНО отключить объект? У меня такое чувство, что есть другой способ сделать то, что вы хотите. Может быть, если бы вы разместили какой-то код...   -  person Manos Dilaverakis    schedule 13.10.2010


Ответы (6)


Насколько я знаю, невозможно уничтожить экземпляр класса из самого класса. Вам придется отключить экземпляр в пределах его области.

$myClass = new fooBar();
unset($myClass);

Отчасти связано: выполнение вышеприведенного автоматически вызовет любой существующий __destruct() магический метод класса, чтобы вы могли выполнить любую дополнительную очистку. Подробнее

person Mike B    schedule 13.10.2010

Мануал прав. Выхода нет.

unset в основном используется для того, чтобы сказать: "Я закончил использовать определенную переменную; ее можно рассматривать для сборки мусора, насколько я понимаю.

Проблема в том, что $this в любом случае имеет смысл только в контексте вызова метода. Как только метод завершится, $this выйдет из области видимости (по сути) и больше не будет считаться ссылкой на объект. (Для практических целей.)

Так что вам не нужно беспокоиться об освобождении $this. PHP позаботится об этом.

Что вы, вероятно, пытаетесь сделать, так это unset другие переменные, которые могут ссылаться на один и тот же экземпляр. И если у вас нет доступа к ним из метода, вы не можете их трогать, а тем более unset их.

person VoteyDisciple    schedule 13.10.2010

Я потратил много времени на поиск способа установить значение NULL для объекта изнутри него самого.

Пожалуйста, попробуйте этот код:

<?php
class bike{
    public $color = "black";
    function destroySelf(bike &$me){
        $me = NULL;
        //$me = new bike();
    }
}
$iRide = new bike();
$iRide->color = "red";
var_dump($iRide);echo " -before <br>";
$iRide->destroySelf($iRide);
var_dump($iRide);echo " -after <br>";
?>

Хитрость в том, что $this не сработает, вам нужно передать фактическую ссылку по ссылке на класс.

Другой способ получить доступ к фактической ссылке без ее передачи — определить объект как глобальный:

class bike{
    public $color = "black";
    function destroySelf(){
        global $iRide;
        $iRide = NULL;
        //$iRide = new bike();
    }
}
$iRide = new bike();
$iRide->color = "red";
var_dump($iRide);echo " -before <br>";
$iRide->destroySelf();
var_dump($iRide);echo " -after <br>";
person N7ck    schedule 02.08.2014
comment
Второй - плохая версия, это означает, что вы должны использовать только имя isRide для объекта. - person Davit Huroyan; 03.10.2019

Поместите свой код удаления в деструктор, если вы хотите избавиться от объекта и файла, который он обертывает одновременно. Затем просто unset объект вместо вызова метода удаления.

person Alin Purcaru    schedule 13.10.2010
comment
Я тоже думал об этом, но он автоматически удалит файл в конце выполнения скрипта :) Кажется, нет способа отличить явное unset от конца скрипта. - person Pekka; 13.10.2010
comment
Тогда не повезло. Вам просто нужно будет использовать 2 вызова ->delete(), а затем unset. Или переосмыслить свой дизайн. - person Alin Purcaru; 13.10.2010

Нет, только наоборот, можно использовать волшебную функцию __destruct():

 public function  __destruct() {
    //delete file
 }

Это сработает, когда кто-то сбросит () объект И, когда скрипт завершится. Но Объект не может уничтожить себя.

person Hannes    schedule 13.10.2010

если у тебя есть класс

class XXX
{

....

}

и у вас есть объект

$obj = new XXX();

Вы можете просто использовать функцию unset() для удаления объекта

unset($obj);
person Davit Huroyan    schedule 03.10.2019