PHP 5.5.0 officieel uitgebracht

Toegevoegd door Wouter J, 8 jaar geleden

PHP 5.5.0 officieel uitgebrachtPHP 5.5.0 is nu officieel de nieuwste stable versie van PHP. De nieuwste versie van PHP is vanochtend uitgebracht. Met ingang van PHP 5.5 zal Windows XP en 2003 niet meer op (lokale) serverplatformen worden ondersteund. Ook is de MySQL-library nu officieel afgeschaft, gebruikers worden aangeraden over te stappen naar de opvolger MySQLi of PDO.

Ook bevat PHP5.5 natuurlijk wat nieuwe features:
Generators
Dit is een nieuwe manier van het gebruik van loops. In plaats van het loopen over een array wordt alle code in een loop uitgevoerd bij het aanroepen van yield. Bijv:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function grange($from, $to, $step) {
    for ($i = $from; $i <= $to; $i += $step) {
        yield $i; // roep code aan met $i als waarde
    }
}


foreach (grange(1, 4, 1) as $number) {
    echo $number;
}

// zelfde als:
foreach (array(1, 2, 3, 4) as $number) {
    echo $number;
}

?>

Generators zijn sneller dan arrays.

finally
Try...catch blokken hebben nu een 'finally' keyword erbij. Deze code zal altijd uitgevoerd worden, of er nou wel of geen exception gegooid is.

Array literal referencing
Nadat het in PHP5.4 al mogelijk was direct een element uit een geretourneerde array te halen is het in 5.5 ook mogelijk dit te doen met arrays en strings:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
echo array(1,2,3,4)[2]; // 3
echo "bar"[1]; // 'a'
?>


Password hashing API
Om wachtwoorden nog veiliger te maken bevat PHP 5.5 een password hashing API

Nog meer
En natuurlijk zijn er nog veel meer nieuwe functies, classes en method. Lees alles op php.net

Gerelateerde nieuwsberichten

27/10/2019 Lek ontdekt in PHP bij gebruik van Nginx
02/08/2018 PHP brengt eerste beta uit voor PHP 7.3
04/01/2018 PhpMyAdmin was vatbaar voor ernstig veiligheidslek

 

Er zijn 38 reacties op 'Php 550 officieel uitgebracht'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
- Mark -
- Mark -
8 jaar geleden
 
0 +1 -0 -1
Mooi artikel Wouter.

Wel vreemd dat die generators sneller zijn dan arrays. Je zou zeggen dat ze wat meer rekenwerk nodig hebben.

Ik ben benieuwd wanneer ze bij mijn webhost overstappen, ze zitten nu nog op 5.3. Zal wel weer een tijdje duren aangezien veel mensen nog MySQL_ functies gebruiken.
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
arrays zijn een van de zwakte punten van PHP, ook in snelheid. De generators zorgen ervoor dat je geen arrays meer nodig hebt en dat maakt het dus sneller.
Chris PHP
Chris PHP
8 jaar geleden
 
0 +1 -0 -1
Quote:
Ook is de MySQL-library nu officieel afgeschaft, gebruikers worden aangeraden over te stappen naar de opvolger MySQLi of PDO.


Ben ik toch net bezig om PDO goed onder de knie te krijgen ;-) Ook ben ik bezig om me goed te verdiepen in OOP, combineert mooi.
Koen Vlaswinkel
Koen Vlaswinkel
8 jaar geleden
 
0 +1 -0 -1
Mijn provider (Versio) heeft net van PHP 5.2 en 5.3 geupgrade naar 5.3 en 5.4, en nu komt 5.5 al weer uit. Dat wordt nog wel een jaartje wachten voordat ik PHP 5.5 kan gebruiken op mijn hosting, aangezien PHP 5.4 toch ook al een tijdje uit is en ze nu pas hebben geupgrade.
Chris -
Chris -
8 jaar geleden
 
0 +1 -0 -1
Tja Koen, dat krijg je er van als je bij een budgethoster zit.. Moet je fatsoenlijke hosting nemen, kun je zelf kiezen welke PHP versie je neemt ;-) Paar euro per maand/jaar kun je toch wel vrij maken?
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Thanks Wouter. Mooi stukje.

Dat array literal referencing volg ik niet helemaal. Waarom zou je zoiets willen doen? Waarom zou je een letter uit een hardcoded string willen opvragen? Dit snap ik (maar dat kan nu gewoon al):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$foo
= 'test';
echo $foo[2]; // geeft "s"
?>

Hier heeft het een meerwaarde omdat $foo een variabele is. Echter, om nu uit een hardcoded string een karakter op te halen, wat is daar het nut van?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$foo
= 'test'[2];
?>

dan kun je toch beter dit doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$foo
= 's';
?>

Of begrijk ik het verkeerd?

Dat generator verhaal snap ik niet. Wanneer gebruik je dat in de praktijk? Is het ter vervanging van een foreach loop?
- Raoul -
- Raoul -
8 jaar geleden
 
0 +1 -0 -1
Dat Array literal referencing is dus super lelijk... sinds wanneer kan je een string aanroepen als een array?!
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Sinds een string een array is van characters (chars) en dat is dus al zo vanaf het begin der dagen.

En merk op dat array literal referencing dus ook met arrays werkt, strings geven aan dat het ook met een string werken,
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Nog een nuttig linkje met een lijst van Nikitic (core contributor van php) met de features en veranderingen die hij het mooist vindt https://gist.github.com/nikic/5213689
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Wouter, snap je mijn opmerking betreffenden literal referencing? Wat is er nu precies het nut van?
Pim -
Pim -
8 jaar geleden
 
0 +1 -0 -1
Die array referencing is juist heel handig. Wanneer een functie een array teruggeeft en je daar bijvoorbeeld het eerste element uit wil halen, kan je nu doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$item
= functie($arg)[0];
?>
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Pim, dankjewel voor je reactie. Maar dat kon in versie 5.4 al. Bekijk even het voorbeeldje van mij in mijn 1e post in dit topic. Dan snap je (hopelijk) wat ik bedoel.
Eddy E
Eddy E
8 jaar geleden
 
0 +1 -0 -1
Mooi, weer een hoop nieuwe dingen.

Maar die generator.... euh... is dat niet super omslachtig?
In plaats van één foreach() een foreach-loop een functie aanroepen die een for-loop gebruikt?
Dan is dat onderste toch veel korter?

En is yield dan niet hetzelfde als return?
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
@Eddy... ik snap het (de werking) ook niet :-s
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Yield roept de code in de loop aan, er wordt dus niks teruggegeven. Laat ik een voorbeeldje geven:

Het fetchen van data in MyPDO. Dat zou er in PHP 5.4 zo uit hebben gezien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php

class MyPDO
{
    // ...

    public function fetchAll()
    {

        $result = $this->getResults();
        $return = array();

        foreach ($result as $row) {
            $return[] = $this->doFetch($row);
        }


        return $return;
    }
}


// ...
foreach ($db->fetchAll() as $row) {
    echo $row['name'];
}

?>


Stel we willen deze foreach loop afbreken na 4 records. Dan moet de fetch method alsnog eerst alle opgehaalde records fetchen voordat de loop geloopt kan worden.

Nu gebruiken we generators:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class MyPDO
{
    // ...

    public function fetchAll()
    {

        $result = $this->getResults();

        foreach ($result as $row) {
            yield $this->doFetch($row);
        }
    }
}


// loop blijft hetzelfde
?>


Nu wordt er geen array aangemaakt en daarna door die array geloopt, maar de foreach loop roept de code aan voor 1 row zodra hij nodig is. Dit betekend dat we in ons voorbeeld maar 4 keer fetchen.
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Pfff, t zal ongetwijfeld aan mij liggen maar ik snap er nog steeds niks van. Waar komt die 4 keer fetchen vandaan? En waarom een eigen fetchAll terwijl pdo een eigen fetchall method heeft? Ik snap dat je iets probeert duidelijk te maken, maar ik snap niet A) hoe het werkt en B) wat het nut is. Heb je niet een heel simpel basis voorbeeldje? Echt gewoon even van begin tot eind in simpele Jip en Janneke taal?
- Raoul -
- Raoul -
8 jaar geleden
 
0 +1 -0 -1
@Ozzie
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

class X {
  public function getNamen() {
    $namen = array('Ozzie', 'Raoul', 'Wouter');

    foreach($namen as $naam) {
      yield $naam;
    }
  }
}


$x = new X();
// geeft Ozzie, Raoul en wouter.
foreach($naam as $x->getNamen()) {
  echo $naam;
}


?>

Compleet nutteloos, maar maakt wel duidelijk wat het doet.
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Aha, da's al een wat duidelijker voorbeeld. Dus yield roept de code in de aanroepende loop aan? In jouw voorbeeld echo $naam. Correct?

En wanneer gebruik je zoiets nu in de praktijk?
- Raoul -
- Raoul -
8 jaar geleden
 
0 +1 -0 -1
@Ozzie

Je zou het kunnen gebruiken als vervanging van een array... denk ik?
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Maar je gebruikt nu toch nog steeds een array? :-s
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Ozzie, maar in mijn voorbeeld zie je dat de array verdwenen is. Raoul's voorbeeld ga je natuurlijk nooit gebruiken, want dan verplaats je de loop in een functie en maak je nog een extra loop.

Ik zou hem in de situatie die ik schetste wel gebruiken. Het is een soort lazy loading principe, zolang je de gegevens nog niet nodig hebt worden ze niet gefetched. Pas zodra we bij dat item aankomen en de loop is nog steeds bezig zullen we het volgende element fetchen en in de loop gooien.
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Hey Wouter, het zal aan mij liggen, maar ik snap de werking niet zo heel goed. Het voorbeeld van Raoul vind ik iets duidelijker, maar ik snap de constructie nog niet echt.
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Yield betekend roep de loop aan en geef de waarde die je aan yield meegeeft mee aan de waarde van de loop.
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Maar klopt dit voorbeeld van Raoul dan?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach($naam as $x->getNamen()) {
  echo $naam;
}

?>

Moet dat niet zijn:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
foreach($x->getNamen() as $naam) {
  echo $naam;
}

?>
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Helemaal correct, foutje van Roel
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Oké, ik vond het al wat vreemd. Maar ik ben wel heel bijzonder benieuwd wanneer je dit in de praktijk toepast. Dat fetch voorbeeld van jou zou je in de praktijk toch ook niet gebruiken, want je haalt toch altijd datgene op wat je ook altijd wilt hebben? En je zou natuurlijk ook gewoon fetch kunnen gebruiken waarmee je 1 row ophaalt in plaats van dat je fetchAll gebruikt. Ik vind het nog een beetje vaag allemaal...
- Raoul -
- Raoul -
8 jaar geleden
 
0 +1 -0 -1
Ozzie, om het simpel te zeggen: generators vervangen het returnen van arrays.
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Quote:
Ozzie, om het simpel te zeggen: generators vervangen het returnen van arrays.

Hmmm, het zal wel, als jij het zegt :-)

Wanneer gebruik je het in de praktijk? Kan ik op dit moment mijn code ergens efficiënter maken door het gebruik van generators?
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Wat iterators voor classes is zijn generators voor functies.
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Ik ga er wel een keer een tutorial over lezen of zo, want ik word er zo niet veel wijzer van :-)
- Raoul -
- Raoul -
8 jaar geleden
 
0 +1 -0 -1
Dus je snapt nu al wat het doet, maar nog niet echt de use cases?
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Zo zou je het kunnen stellen Raoul. Wanneer gebruik je het? Zijn er situaties waarin ik het nu in mijn eigen code zou kunnen toepassen? Is het de bedoeling dat ik arrays in loops ga vervangen? :-s
- Raoul -
- Raoul -
8 jaar geleden
 
0 +1 -0 -1
Yup, je zou in je foreach dan direct yield kunnen doen.
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Raoul, kun je me eens een simpel voorbeeld geven?

Stel ik heb nu dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$persons
  = ['raoul', 'wouter', 'ozzie'];
$greeting = 'Hello';
foreach($persons as $person) {
  $greeting .= ' ' . $person;
}

echo $greeting . '.';
?>

Hoe kun je ditzelfde dan met een generator doen?
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function greetPersons($greeting = 'Hello') {
    $persons = ['piet', 'thijs', 'oscar'];

    foreach ($persons as $person) {
        $greeting .= (yield $person);
    }


    return $greeting.'!';
}


foreach (greetPersons() as $person) {
    return ' '.$person;
}

?>


Maar dan is het gebruik van generators dus vrij nutteloos. Ik zou het gebruiken in methoden waarbij ik zeker weet dat ze alleen in foreach loops gebruikt worden en waarbij snelheid mijn grootste zorgen is en ik dus niet een zware actie wil doen op een array met 100 elementen waarbij ik er soms maar 10 nodig heb.
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Maar wat is nu eigenlijk de bedoeling. Dat er geen arrays meer worden gebruikt? Want nu zie ik nog steeds een array. Anders ga ik toch maar een keer een tutorial hierover lezen (weet jij er een?) want het ontgaat me nu weer volledig wat de bedoeling ervan is. Ligt niet aan jou maar aan mij.
Wouter J
Wouter J
8 jaar geleden
 
0 +1 -0 -1
Nee, natuurlijk niet geen arrays. De bedoeling is dat functies die altijd in foreach loops gebruikt worden nu geen arrays meer moeten terug sturen, maar yield "moeten" gebruiken.

Misschien dat het voorbeeld in op bugs.php.net je beter aanspreekt: https://wiki.php.net/rfc/generators
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Ozzie PHP
Ozzie PHP
8 jaar geleden
 
0 +1 -0 -1
Hmmm, lastig... als ik het dus goed begrijp gaat het om situaties waarin je normaal een complete array terugkrijgt maar via een generator krijg je telkens een row terug? En dit gebruik je omdat je wellicht niet de hele array nodig hebt?

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.