Quber
@Quber
PHP Team lead

Как удалить объект, вызвав какой-либо его же собственный метод (PHP)?

Например, есть объект, который вызывает какую-то свою функцию (метод). Необходимо, чтобы после её вызова, объект стал null. Далее он записывается в базу, и если он null то ничего не записывается. Собственно мне нужно разрушить его собственной функцией, как это сделать?

P.S. я знаю, как это сделать с помощью return null или return $this. Но мне нужен метод типа void, который ничего не возвращает.

Спасибо.

UPD
Пробовал так:
public function test()
{
   unset($this);
}

Не помогло :(
  • Вопрос задан
  • 3740 просмотров
Решения вопроса 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Никак. Насколько я знаю в php вообще нельзя явно уничтожить объект. Только убить на него ссылку и соответственно дождаться сборщика мусора.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Эмм... А __destruct() не? Вроде он вызывается когда объект разрушается, но если его вызвать явно...
Ответ написан
thestump
@thestump
программист PHP
Чтобы полностью уничтожить объект своей собственной функцией то никак потому, что для его уничтожения его надо выгрузить из памяти, а пока не отработал его внутреняя функция никак. Для уничтожения объекта надо завершить выполнение всех внутренних функций во внешней функции обнулить ссылку на объект удобным способом. Как сказано в первом ответе придет сборщик мусора и освободит память. Вызывая unset ($this) вы уничтожаете указатель ссылающийся на собственный объект, но не сам объект.
Ответ написан
Комментировать
copist
@copist
Empower people to give
В объекте предусмотрите приватное свойство-флаг, который будет означать, что этот объект нехранимый.

<?php
class Dummy
{
    /**
     * Хранимый ли?
     * @var boolean
     */
    private $persistent = true;

    public $me;

    function __construct($me)
    {
        $this->me = $me;
    }

    public function forgetMe()
    {
        $this->persistent = false; // теперь нехранимый
    }

    /**
     * Какая то логика при сохранении
     */
    public function save()
    {
        if (!$this->persistent) // если нехранимый
        {
            echo $this->me . " was NOT saved\n";
            return true; // понять, простить и забыть
        }
        echo $this->me . " saved OK\n";
    }
}

$obj1 = new Dummy('first');
$obj2 = new Dummy('second');

$obj1->forgetMe();
$obj1->save(); // -> first was NOT saved
$obj2->save(); // -> second saved OK
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы