5
votes

PHP: Y a-t-il l'opposé de l'opérateur de fusion nul?

Je suis souvent dans une situation où la variable peut être object ou null .

Quand je mets des données dans la base de données, je dois m'en tenir à quelque chose comme ça :

// @var User|null $user
$data['id_user'] = $user!==null ? $user->getId() : null;

Y a-t-il un moyen de shorthen ceci? Je connais ?? , mais c'est un peu le contraire.

J'utilise PHP 7.1.


7 commentaires

stackoverflow.com/q/1993409/534109 - vous recherchez l'opérateur elvis


Cela ne fonctionnera pas exactement dans ce cas, n'est-ce pas? L'opérateur Elvis serait équivalent à $ user? $ user: null; (donc $ user sera assigné plutôt que $ user-> getId () ) - et vous ne voulez pas faire < code> $ user-> getId ()?: null au cas où l'objet $ user lui-même serait null (appelant ainsi une méthode sur null < / code>) ... euh huh hein. Merci beaucoup.


L'opérateur Elvis générera également E_NOTICE si $ user n'est pas défini.


En fait, votre code existant génère également E_NOTICE, vous devriez probablement utiliser quelque chose comme: isset ($ user)? $ utilisateur-> getId (): null;


^ ou pour les plus prudents un mélange de isset () , is_object () et method_exists () ... O_o ... Barmar's solution / hack (selon la perspective) est meilleure à la minute.


En fait, j'utilise $ user! == null ici. Mon erreur, désolé. J'ai modifié la question en conséquence.


Veuillez voir ma réponse mise à jour ci-dessous à propos de l'opérateur nullsafe. Je pense que c'est ce que tu voulais.


3 Réponses :


-3
votes

Je ne pense pas qu'il y ait un opérateur qui fasse précisément cela.

Le plus proche est l'opérateur de suppression d'erreurs @ :

$data['id_user'] = @$user->getId();

Si $ user-> getId () obtient une erreur, le message d'erreur est supprimé et la valeur est null.


0 commentaires

0
votes

Si vous définissez une classe __toString () dans votre objet utilisateur et que celle-ci renvoie l'identifiant, vous pouvez utiliser l'opérateur de fusion nul:

class User
{
    public function __toString()
    {
        return (string) $this->getId();
    }
}

$data['id_user'] = $user ?? null;

Cela ne générera aucun avertissement non plus.

Cependant, cela n'aide pas trop si vous avez plus d'un champ avec lequel vous voulez faire cela.


0 commentaires

0
votes

Depuis PHP 8, il existe l ' l'opérateur nullsafe ? -> . Avec lui, vous pouvez refactoriser votre code comme ceci:

// @var User|null $user
$data['id_user'] = $user === null ? null : $user->getId();

Avant PHP 8, vous pouviez utiliser la conversion automatique de booléens pour tirer parti du fait que, lors de la conversion en booléen, null est considéré comme faux , mais d'autres objets sont not (sauf apparemment, les objets SimpleXML créés à partir de balises vides sont également considérés comme faux). Vous pourriez donc raccourcir votre exemple comme suit:

// @var User|null $user
$data['id_user'] = $user ? $user->getId() : null;

Cependant, cela peut être moins lisible depuis le? peut impliquer pour certaines personnes que vous travaillez avec un booléen pour commencer, ou cela pourrait obliger le lecteur à réfléchir à la façon dont null est converti en bool. Votre code d'origine est plus explicite et donc potentiellement plus lisible. Personnellement, afin de faire travailler les cerveaux moins dur, j'aime éviter d'utiliser "pas égal" autant que possible, et juste aller avec un "égal". Vous pouvez donc refactoriser votre code pour qu'il ressemble à ceci:

// @var User|null $user
$data['id_user'] = $user?->getId();


0 commentaires