sobrecarga que ejemplos constructores __construct php constructor error-handling null

ejemplos - que es un constructor en php



Constructor PHP para devolver un NULL (6)

Tengo este codigo ¿Es posible que un constructor de objetos de User falle de alguna manera para que $this->LoggedUser tenga asignado un valor NULL y el objeto se libere después de que el constructor regrese?

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


AFAIK esto no se puede hacer, new siempre devolverá una instancia del objeto.

Lo que normalmente hago para solucionar esto es:

  • Agregar un ->valid indicador booleano ->valid al objeto que determina si un objeto se cargó con éxito o no. El constructor entonces pondrá la bandera

  • La creación de una función de envoltura que ejecuta el new comando, devuelve el nuevo objeto en caso de éxito, o si falla, lo destruye y devuelve false

-

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

Me interesaría escuchar sobre enfoques alternativos, pero no conozco ninguno.


Considéralo de esta manera. Cuando usas new , obtienes un nuevo objeto. Período. Lo que está haciendo es que tiene una función que busca un usuario existente y lo devuelve cuando lo encuentra. Lo mejor para expresar esto es probablemente una función de clase estática como User :: findUser (). Esto también es extensible cuando estás derivando tus clases de una clase base.


Cuando un constructor falla por alguna razón desconocida, no devolverá un valor NULO o FALSO, pero arroja una excepción. Al igual que con todo con PHP5. Si no maneja la excepción, la secuencia de comandos dejará de ejecutarse con un error de excepción no detectada.


Suponiendo que está utilizando PHP 5, puede lanzar una excepción en el 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) {} }

Para mayor claridad, puedes envolver esto en un método de fábrica estático:

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

Además, algunas versiones de PHP 4 le permitieron establecer $ esto en NULL dentro del constructor, pero creo que nunca fue oficialmente sancionado y la "característica" finalmente se eliminó.


Una fábrica podría ser útil aquí:

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


tal vez algo como esto:

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