Я столкнулся с ситуацией, в которой мне нужно вызвать __destruct
если условие истинно в __construct
!
как вызвать деструктор в конструкторе?
есть ли способ для этого?
Я могу сделать это с помощью трюка, но мне нужно сделать это внутри моего класса, цель состоит в том, чтобы уничтожить класс, если он не соответствует моим критериям.
РЕДАКТИРОВАТЬ :
В конструкторе я проверяю права пользователей. Если пользователь, который пытается удалить сообщение, является кем-то другим, кроме admin, тогда объект класса не должен быть экземплярным или другим словом должно быть уничтожено.
Избегайте выполнения фактической работы в ваших конструкторах. Конструкторы должны по существу строить экземпляр объекта. Не имеет смысла вызывать __destruct()
из конструктора, потому что экземпляр не принадлежит методу класса, а функции, называемой new
оператором.
Спросите себя, что должен вернуть new
оператор на сайте вызова в случае, если объект не может быть сконструирован?
$obj = new Class();
Что следует назначать $obj
если объект не может быть правильно сконструирован? NULL
? Или, может быть, код вообще не имеет смысла?
У вас есть несколько вариантов:
Удалите любой конструктор без конструктора из конструктора, чтобы конструктор не смог вообще сбой. Поместите любой код, который терпит неудачу в другом методе. Пример:
$obj = new Class(); if ( $obj->initSomeStateThatMayFail() ) { // good, proceed... } else { // handle failure somehow... } unset($obj); // calls __destruct()
Если отказ в конструкторе должен быть передан вызывающему абоненту, используйте статический заводский метод, который проверяет, является ли он действительным для создания экземпляра класса, и возвращает null
или новый экземпляр соответствующим образом.
class Class { static function makeClass() { if ( testIfValidToInstantiate() ) { return new self(); } else { return null; } } // ... } $obj = Class::makeClass(); if ( $obj !== null ) { // proceed... }
Если код вообще не имеет смысла, если класс не может быть построен, возможно, вы должны выбросить исключение.
class Class { function __construct() { if ( !testIfValidToInstantiate() ) throw new Exception( "Unexpected condition" ); // ... } } try { $obj = new Class(); // ... } catch ( Exception $e ) { // do something to handle this situation... }
Пожалуйста, поймите, что вызов деструктора – это не то же самое, что удаление класса из рабочего набора!
Если myClass – это класс, в котором вы разрушаете конструктор, тогда
$a=new myClass();
все равно приведет к тому, что $ a будет назначен экземпляру myClass!
Вы не можете уничтожить объект из конструктора, но вы можете установить его в переменной, и это правда уничтожить его после его создания. Что-то вроде этого:
<?php class test{ function __construct(&$dest=false){ echo "Constructed\n"; if(1 == 1){ //Some condition $dest = true; } } function __destruct(){ echo "De-Constructed\n"; } } $a = new test($d); if($d){ unset($a); } echo "End Prog\n";
с<?php class test{ function __construct(&$dest=false){ echo "Constructed\n"; if(1 == 1){ //Some condition $dest = true; } } function __destruct(){ echo "De-Constructed\n"; } } $a = new test($d); if($d){ unset($a); } echo "End Prog\n";
Демо: http://ideone.com/fJxOq
Если вы создадите исключение внутри конструктора, то объект не будет создан … поэтому, если код конструктора идентифицирует ваше условие, уберите все, что вам нужно в свой конструктор, и выбросьте исключение … помня, чтобы заключить ваш экземпляр внутри try / catch block.
class testClass { public function __construct($killMe=false) { if ($killMe) { // Do any tidying up you need within the class throw new Exception('KILLED'); } } } try { $a = new testClass(false); } catch (Exception $e) { echo 'DIED IN CONSTRUCTION',PHP_EOL; } var_dump($a); try { $b = new testClass(true); } catch (Exception $e) { echo 'DIED IN CONSTRUCTION',PHP_EOL; } var_dump($b);