__destruct в __construct?

Я столкнулся с ситуацией, в которой мне нужно вызвать __destruct если условие истинно в __construct !

как вызвать деструктор в конструкторе?

есть ли способ для этого?

Я могу сделать это с помощью трюка, но мне нужно сделать это внутри моего класса, цель состоит в том, чтобы уничтожить класс, если он не соответствует моим критериям.

РЕДАКТИРОВАТЬ :

В конструкторе я проверяю права пользователей. Если пользователь, который пытается удалить сообщение, является кем-то другим, кроме admin, тогда объект класса не должен быть экземплярным или другим словом должно быть уничтожено.

Избегайте выполнения фактической работы в ваших конструкторах. Конструкторы должны по существу строить экземпляр объекта. Не имеет смысла вызывать __destruct() из конструктора, потому что экземпляр не принадлежит методу класса, а функции, называемой new оператором.

Спросите себя, что должен вернуть new оператор на сайте вызова в случае, если объект не может быть сконструирован?

 $obj = new Class(); 

Что следует назначать $obj если объект не может быть правильно сконструирован? NULL ? Или, может быть, код вообще не имеет смысла?

У вас есть несколько вариантов:

  1. Удалите любой конструктор без конструктора из конструктора, чтобы конструктор не смог вообще сбой. Поместите любой код, который терпит неудачу в другом методе. Пример:

     $obj = new Class(); if ( $obj->initSomeStateThatMayFail() ) { // good, proceed... } else { // handle failure somehow... } unset($obj); // calls __destruct() 
  2. Если отказ в конструкторе должен быть передан вызывающему абоненту, используйте статический заводский метод, который проверяет, является ли он действительным для создания экземпляра класса, и возвращает null или новый экземпляр соответствующим образом.

     class Class { static function makeClass() { if ( testIfValidToInstantiate() ) { return new self(); } else { return null; } } // ... } $obj = Class::makeClass(); if ( $obj !== null ) { // proceed... } 
  3. Если код вообще не имеет смысла, если класс не может быть построен, возможно, вы должны выбросить исключение.

     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);