У меня та же проблема, что и у вас, в какой-то момент я хочу заставить объект удалить себя, но это не возможно в 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 <-> БД / Файлы / Хранилище "