In PHP 7: De coalesce operator

Toegevoegd door Wouter J, 12 jaar geleden

In PHP 7: De coalesce operatorDe null coalesce operator die in PHP 7 wordt toegevoegd zal gaan zorgen voor een makkelijkere manier om iets een default waarde mee te geven .

Vaak kom je in je code op een gegeven moment op een punt waarbij je moet kijken of iets bestaat en anders een default waarde gebruiken. Bijvoorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if (isset($_SESSION['user'])) {
    $user = $_SESSION['user'];
}
else {
    $user = 'anoniem';
}

?>


Je kon dit al iets mooier oplossen als je de ternary operator gebruikte:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$user
= isset($_SESSION['user']) ? $_SESSION['user'] : 'anoniem';
?>


Je moet echter nog wel steeds twee keer $_SESSION['user'] typen. Om dit te voorkomen komt er in PHP 7 de coalesce operator bij:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$user
= $_SESSION['user'] ?? 'anoniem';
?>

Als $_SESSION['user'] bestaat wordt nu die waarde gepakt en anders wordt 'anoniem' gebruikt.

Gerelateerde nieuwsberichten

13/06/2024 PHP verhelpt kritiek beveiligingslek in Windows-versie
28/02/2024 LockBit website door politie gekraakt via mogelijk lek in PHP
08/05/2023 PHPhulp verhuisd

 

Er zijn 15 reacties op 'In php 7 de coalesce operator'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Ozzie PHP
Ozzie PHP
12 jaar geleden
 
0 +1 -0 -1
Wouter, bestond dat niet al?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$a
= 'hoi';
$b = $a ?: 'tot ziens';
echo $b;
?>

Wanneer komt versie 7 eigenlijk?
Wouter J
Wouter J
12 jaar geleden
 
0 +1 -0 -1
Ozzie, dat kijk niet of $a bestaat. Het kijkt alleen of $a een falsey waarde is.
Ozzie PHP
Ozzie PHP
12 jaar geleden
 
0 +1 -0 -1
Wouter, je bedoelt dat de bestaande variant kijkt naat true/false en de nieuwe variant naar isset?
Wouter J
Wouter J
12 jaar geleden
 
Inderdaad.

En wanneer PHP 7 uitkomt is niet bekent. Er is nu een RFC (Request For Comments) om de development periode te beperken tot 1 jaar, maar ik weet niet of dat geaccepteerd wordt. Tevens komt boven die development periode dan nog een test periode (alpha1-n, beta1-n, rfc1-n). Dus verwacht op zijn vroegst 1.5 jaar.

Via deze "In PHP 7" berichten blijf ik iedereen op de hoogte houden van alle updates omtrent PHP 7.
Ozzie PHP
Ozzie PHP
12 jaar geleden
 
0 +1 -0 -1
Oké, thanks. Leuk die berichten, maar jammer dat we het nog lang niet kunnen gebruiken. Je maakt ons blij met een soort van dooie mus ;-)))
Willem vp
Willem vp
12 jaar geleden
 
1 +1 -0 -1
Even de puntjes op de i zetten:

In de tekst wordt gesuggereerd dat de constructie met de ternary operator pas werkt vanaf PHP 5.3. Dat klopt niet; PHP 4 ondersteunde dat ook al.

Wat wel pas werkt vanaf PHP 5.3 is de elvis-operator (?:) die Ozzie in zijn eerste reactie noemde.
Ozzie PHP
Ozzie PHP
12 jaar geleden
 
0 +1 -0 -1
Ik wist niet dat het ELVIS-operator heette :-)

Echter, als ik deze pagina bekijk: http://www.webtipblog.com/php-elvis-operator/

... dan wordt met die Elvis operator een isset-controle uitgevoerd. Dat klopt dan toch niet?
Wouter J
Wouter J
12 jaar geleden
 
0 +1 -0 -1
Willem, je hebt gelijk. Ik heb het verbeterd, bedankt!
Willem vp
Willem vp
12 jaar geleden
 
0 +1 -0 -1
@Ozzie: Hoe ga ik dit netjes zeggen? Die pagina waarnaar je refereert is geschreven door een of andere kansloze pipo die niet het verschil weet tussen isset() en een expressie die naar false evalueert.

In de laatste regel van het artikel staat het goed uitgelegd, maar die regel heeft 'ie dan ook niet zelf geschreven. ;-)
Ozzie PHP
Ozzie PHP
12 jaar geleden
 
0 +1 -0 -1
@Willem: ah ja... zo snap ik het weer :)


12 jaar geleden
 
0 +1 -0 -1
Ik snap uit het voorbeeld niet helemaal wat die coalesce operator verbetert.. het automatiseerd alleen PHP code, die we zelf ook al konden automatiseren:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
foreach (
  array(
    'user' => 'anoniem',
    'password' => '',
  ) as $k => $v)
{
  isset($_SESSION[$k]) or $_SESSION[$k] = $v;
}


En dat zit al ergens verstopt in je raamwerk zodat je er niet meer over hoeft na te denken. Of in een abstracte helper class..
Ozzie PHP
Ozzie PHP
12 jaar geleden
 
0 +1 -0 -1
Volgens mij vergelijk je twee verschillende dingen met elkaar. In het voorbeeld bovenin vindt altijd een toewijzing plaats. Er wordt altijd een waarde aan een variabele gekoppeld. In jouw voorbeeld is dat niet het geval. Twee verschillende situaties dus.


12 jaar geleden
 
0 +1 -0 -1
Mja, daar heb je gelijk in, het maakt de notatie korter om een (nieuwe) variabele te vullen. Misschien was de gedachte wel dat het de programmeurs tiktijd bespaart en de CPU parse-tijd. Maar verder?
Willem vp
Willem vp
12 jaar geleden
 
0 +1 -0 -1
Een mooi voorbeeld kun je zien in dit bericht. Met de ??-operator kan het codefragment een stuk korter en duidelijker:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
    function get($string, $default = '')
    {
        $return = $_GET[$string]
                  ?? $_POST[$string]
                  ?? $_COOKIE[$string]
                  ?? $default;
        # [...]
    }
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen


12 jaar geleden
 
0 +1 -0 -1
Ja het is duidelijker... maar voor die ene functie kan je dat toch ook schrijven met $_REQUEST of desnoods gewoon uitschrijven en commentaar erbij voor de duidelijkheid.
De praktijk zal moeten uitwijzen of die ?? operator echt handig is. Anderzijds zijn er nu ook genoeg operatoren die ik nooit gebruik, meerdere extenties die ongeveer hetzelfde doen.. keuze is niet altijd slecht.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Labels

PHP nieuws opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.