web-dev-qa-db-fra.com

Que signifie "double point d'interrogation (??)" dans PHP

Je plongeais dans le code de Symfony framwork (version 4) et trouvai cette paix de code:

$env = $_SERVER['APP_ENV'] ?? 'dev';

Je ne suis pas vraiment sûr de ce que cela fait, mais j'imagine que cela se développe comme suit:

$env = $_SERVER['APP_ENV'] != null ? $_SERVER['APP_ENV'] : 'dev';

Ou peut-être:

$env = isset($_SERVER['APP_ENV']) ? $_SERVER['APP_ENV'] : 'dev';

Quelqu'un a une précision sur le sujet?

EDIT:

À toutes les personnes qui ont répondu à la question: merci À toutes les personnes qui ont marqué ma question comme négative car il y a déjà une question similaire ( opérateur ternaire PHP vs opérateur de coalescence nul ):

Il est vrai que les deux questions sont très similaires. Cependant, il est difficile pour tout le monde d’imaginer que le "??" s'appelle l'opérateur de coalescence.

Sinon, je pourrais facilement le trouver sur la documentation officielle:

http://php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op

Cependant, pour quelqu'un qui ne savait pas que cette fonctionnalité avait été ajoutée dans php 7, il est plus probable qu'il tape:

"opérateur php ??" ou "opérateur point d'interrogation php double"

Et voici pourquoi ma question a une valeur ajoutée.

Je vous demande de reconsidérer vos commentaires négatifs. Merci

Cordialement, Epixilog

58
epixilog

C'est "l'opérateur de coalescence nul", ajouté dans php 7.0. La définition de comment cela fonctionne est:

Il retourne son premier opérande s'il existe et n'est pas NULL; sinon, il retourne son deuxième opérande.

Il ne s’agit donc que de isset() chez un opérateur pratique.

Ces deux sont équivalents:

$foo = $bar ?? 'something';
$foo = isset($bar) ? $bar : 'something';

Documentation: http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.coalesce

Dans la liste des nouvelles fonctionnalités de PHP7: http://php.net/manual/fr/migration70.new-features.php#migration70.new-features.null-coalesce-op

Et la RFC originale https://wiki.php.net/rfc/isset_ternary

65
michalhosna
$myVar = $someVar ?? 42;

Est équivalent à :

$myVar = isset($someVar) ? $someVar : 42;
8
Cid
$x = $y ?? 'dev'

est courte pour x = y si y est défini, sinon x = 'dev'

Il y a aussi

$x = $y =="SOMETHING" ? 10 : 20

signifiant si y est égal à 'quelque chose' alors x = 10, sinon x = 20

1
Prodigle