php - сбросить $ this - PullRequest
       8

php - сбросить $ this

7 голосов
/ 13 октября 2010

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

Ответы [ 6 ]

10 голосов
/ 13 октября 2010

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

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

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

2 голосов
/ 02 августа 2014

Я потратил много времени, чтобы найти способ установить в 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>";
?>

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

Другой способ получить доступ к фактической ссылке, не передавая ее, - определить объект как глобальный:

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>";
1 голос
/ 13 октября 2010

Руководство верно.Нет никакого способа.

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

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

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

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

0 голосов
/ 21 сентября 2012

У меня та же проблема, что и у вас, в какой-то момент я хочу заставить объект удалить себя, но это не возможно в php, так что это обходной путь, который может вам помочь.

Вы можете настроитьзакрытый флаг и проверьте, что флаг в каждом методе, который требует объекта, все еще существует, что-то вроде:

<?php

class Bar {
    // internal flag
    private $_removed = false;

    public function remove() {
        // ... some code
        $this->_removed = true;
    }

    private function checkExceptionRemoved() {
        if ($this->_removed) throw new RuntimeException("The object has been removed");
    }

    public function show() {
        $this->checkExceptionRemoved();
        // ... some code
    }

}

?>

Другим способом может быть перегрузка метода вызова _ и проверка флага перед вызовом метода,для этого также может потребоваться переименование методов с некоторым префиксом, например, «pub », чтобы сделать вызов внутри метода __call.Вот пример:

class Foo {
    private $_value;
    private $_valid = true;

    public function IsValid() {
        return $this->_valid;
    }

    private function IsValidException() {
        if (!$this->IsValid()) throw new RuntimeException("The object has been removed");
    }

    public function __construct($value) {
        $this->_value = $value;
    }

    public function __call($name, $arguments) {
        if (!$this->IsValid()) throw new RuntimeException("The object has been removed");
        if (!method_exists($this, "_$name")) throw new Exception("Invalid call, method '$name' does not exists");
        return call_user_func_array(array($this, "_$name"), $arguments);
    }

    protected function _show() {
        echo print_r($this->_value, true)."\n";
    }

    protected function _remove() {
        $this->_valid = false; 
    }
}


$foo = new Foo("Foo Object");
$foo->show();
$foo->remove();
$foo->show(); // Exception !!!

?>

ИМХО, это реальная проблема, что объект не может удалить себя из памяти, но это часть дизайна PHP, это не C ++.Как левая мысль, для этого и других вещей вы могли бы передать логику приложения на другом языке / библиотеках, разработанных на других языках, таких как C ++ / C #, и использовать PHP для использования этой логики, что-то вроде «HTML / CSS / JS / PlainText<-> PHP <-> C # Cli <-> БД / Файлы / Хранилище "

0 голосов
/ 13 октября 2010

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

 public function  __destruct() {
    //delete file
 }

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

0 голосов
/ 13 октября 2010

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

...