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 banderaLa 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 devuelvefalse
-
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