50 votes

Constructeur PHP pour retourner un NULL

J'ai ce code. Est-il possible qu'un constructeur d'objet User échoue pour que $this->LoggedUser se voit attribuer une valeur NULL et que l'objet soit libéré après le retour du constructeur?

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

66voto

jaz303 Points 666

En supposant que vous utilisiez PHP 5, vous pouvez générer une exception dans le constructeur:

 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) {}
}
 

Pour plus de clarté, vous pouvez envelopper cette méthode dans une méthode d'usine statique:

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

Par ailleurs, certaines versions de PHP 4 vous permettaient de définir $ this sur NULL dans le constructeur, mais je ne pense pas qu'il ait été officiellement sanctionné et que la "fonctionnalité" a finalement été supprimée.

12voto

Pekka 웃 Points 249607

Autant que je sache, ce ne peut pas être fait, new retournera toujours une instance de l'objet.

Ce que j'ai l'habitude de faire pour contourner ce n'est:

  • L'ajout d'un ->valid indicateur booléen à l'objet qui détermine si un objet a été chargé avec succès ou non. Le constructeur définit alors le drapeau

  • La création d'une fonction wrapper qui exécute l' new commande renvoie le nouvel objet sur la réussite ou de l'échec détruit et les retours false

-

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

Je serais intéressé à entendre parler d'autres approches, mais je ne sais pas tout.

6voto

Wim Points 7248

Considérez cela comme ça. Lorsque vous utilisez new , vous obtenez un nouvel objet. Période. Ce que vous faites est que vous avez une fonction qui recherche un utilisateur existant et le retourne une fois trouvée. La meilleure chose à exprimer est probablement une fonction de classe statique telle que User :: findUser (). Ceci est également extensible à lorsque vous dérivez vos classes d'une classe de base.

4voto

TheGrandWazoo Points 1744

Lorsqu'un constructeur échoue pour une raison inconnue, il ne renvoie pas de valeur NULL ou FALSE, mais une exception est générée. Comme avec tout avec PHP5. Si vous ne gérez pas l'exception, le script cessera de s'exécuter avec une erreur d'exception non capturée.

4voto

todofixthis Points 4206

Une usine pourrait être utile ici:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X