Я сделал класс, который действует как оболочка файла. Когда пользователь вызывает метод удаления, я хочу сбросить объект (фактически $this). Есть ли способ (обходной путь) сделать это? В мануале сказано, что нельзя...
php - отключить $это
Ответы (6)
Насколько я знаю, невозможно уничтожить экземпляр класса из самого класса. Вам придется отключить экземпляр в пределах его области.
$myClass = new fooBar();
unset($myClass);
Отчасти связано: выполнение вышеприведенного автоматически вызовет любой существующий __destruct()
магический метод класса, чтобы вы могли выполнить любую дополнительную очистку. Подробнее
Мануал прав. Выхода нет.
unset
в основном используется для того, чтобы сказать: "Я закончил использовать определенную переменную; ее можно рассматривать для сборки мусора, насколько я понимаю.
Проблема в том, что $this
в любом случае имеет смысл только в контексте вызова метода. Как только метод завершится, $this
выйдет из области видимости (по сути) и больше не будет считаться ссылкой на объект. (Для практических целей.)
Так что вам не нужно беспокоиться об освобождении $this
. PHP позаботится об этом.
Что вы, вероятно, пытаетесь сделать, так это unset
другие переменные, которые могут ссылаться на один и тот же экземпляр. И если у вас нет доступа к ним из метода, вы не можете их трогать, а тем более unset
их.
Я потратил много времени на поиск способа установить значение 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>";
Поместите свой код удаления в деструктор, если вы хотите избавиться от объекта и файла, который он обертывает одновременно. Затем просто unset
объект вместо вызова метода удаления.
unset
от конца скрипта.
- person Pekka; 13.10.2010
->delete()
, а затем unset
. Или переосмыслить свой дизайн.
- person Alin Purcaru; 13.10.2010
Нет, только наоборот, можно использовать волшебную функцию __destruct():
public function __destruct() {
//delete file
}
Это сработает, когда кто-то сбросит () объект И, когда скрипт завершится. Но Объект не может уничтожить себя.
если у тебя есть класс
class XXX
{
....
}
и у вас есть объект
$obj = new XXX();
Вы можете просто использовать функцию unset() для удаления объекта
unset($obj);