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.
3 Réponses :
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
.
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.
Depuis PHP 8, il existe l ' l'opérateur nullsafe 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: 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: ? -> . Avec lui, vous pouvez refactoriser votre code comme ceci:
// @var User|null $user
$data['id_user'] = $user === null ? null : $user->getId();
// @var User|null $user
$data['id_user'] = $user ? $user->getId() : null;
// @var User|null $user
$data['id_user'] = $user?->getId();
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 seraitnull
(appelant ainsi une méthode surnull < / 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 ()
etmethod_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.