Costruttore PHP per restituire un valore NULL

Ho questo codice. È ansible che un constructor di oggetti User fallisca in qualche modo, in modo che $this->LoggedUser sia assegnato ad un valore NULL e l'object venga liberato dopo che il constructor ha restituito?

 $this->LoggedUser = NULL; if ($_SESSION['verbiste_user'] != false) $this->LoggedUser = new User($_SESSION['verbiste_user']); 

Supponendo che tu stia utilizzando PHP 5, puoi generare un'exception nel constructor:

 class NotFoundException extends Exception {} class User { public function __construct($id) { if (!$this->loadById($id)) { throw new NotFoundException(); } } } $this->LoggedUser = NULL; if ($_SESSION['verbiste_user'] != false) { try { $this->LoggedUser = new User($_SESSION['verbiste_user']); } catch (NotFoundException $e) {} } 

Per maggiore chiarezza, è ansible racchiuderlo in un metodo factory statico:

 class User { public static function load($id) { try { return new User($id); } catch (NotFoundException $unfe) { return null; } } // class body here... } $this->LoggedUser = NULL; if ($_SESSION['verbiste_user'] != false) $this->LoggedUser = User::load($_SESSION['verbiste_user']); 

Per inciso, alcune versioni di PHP 4 ti hanno permesso di impostare $ this a NULL all'interno del constructor, ma non penso che sia mai stato ufficialmente sanzionato e la 'feature' è stata rimossa.

AFAIK questo non può essere fatto, il new restituirà sempre un'istanza dell'object.

Quello che faccio di solito per ovviare a questo è:

  • Aggiunta di un flag boolean ->valid sull'object che determina se un object è stato caricato correttamente o less. Il constructor quindi imposta la bandiera

  • Creazione di una function wrapper che esegue il new command, restituisce il nuovo object in caso di successo o in caso di fallimento lo distrugge e restituisce false

 function get_car($model) { $car = new Car($model); if ($car->valid === true) return $car; else return false; } 

Sarei interessato a conoscere approcci alternativi, ma non ne conosco nessuno.

Consideralo in questo modo. Quando usi new , ottieni un nuovo object. Periodo. Quello che stai facendo è che hai una function che cerca un utente esistente e la restituisce quando viene trovata. La cosa migliore da esprimere è probabilmente una function di class statica come User :: findUser (). Questo è anche estendibile a quando si stanno derivando le classi da una class base.

Una fabbrica potrebbe essere utile qui:

 class UserFactory { static public function create( $id ) { return ( filter_var( $id, FILTER_VALIDATE_INT, [ 'options' => [ 'min_range' => 1, ] ] ) ? new User( $id ) : null ); } } 

Quando un constructor non riesce per qualche motivo sconosciuto, non restituirà un valore NULL o FALSE ma genererà un'exception. Come con tutto con PHP5. Se non gestisci l'exception, lo script smetterà di essere eseguito con un errore Eccezione non rilevata.

forse qualcosa del genere:

 class CantCreateException extends Exception{ } class SomeClass { public function __construct() { if (something_bad_happens) { throw ( new CantCreateException()); } } } try{ $obj = new SomeClass(); } catch(CantCreateException $e){ $obj = null; } if($obj===null) echo "couldn't create object"; //jaz303 stole my idea an wrap it into a static method