<?php
/*
 * A generator allows you to write code that uses foreach
 * to iterate over a set of data without needing to build
 * an array in memory, which may cause you to exceed a memory
 * limit, or require a considerable amount of processing time
 * to generate. Instead, you can write a generator function,
 * which is the same as a normal function, except that instead
 * of returning once, a generator can yield as many times as it
 * needs to in order to provide the values to be iterated over. 
 */
function getLines($file) {
  $f = fopen($file, 'r');
  try {
    while ($line = fgets($f)) {
      yield $line;
    }
  } finally {
     fclose($f);
  }
}
foreach (getLines("file.txt") as $n => $line) {
    if ($n > 5) break;
    echo $line;
}More info about Generators here
try {
  // Some dangerous code...
} catch (Exception $e) {
  // Handle the error here...
} finally {
  // This will be executed always
}<?php
// To create a password hash
$myHash = password_hash("mysupersecretpassword", PASSWORD_DEFAULT);
// To verify that a password matches the hash
$isValid = password_verify("mysupersecretpassword", $myHash);<?php
/*
 * The foreach control structure now supports unpacking nested
 * arrays into separate variables via the list() construct. 
 */
$array = [
  [1, 2],
  [3, 4],
];
foreach ($array as list($a, $b)) {
  echo "A: $a; B: $b\n";
}<?php
/*
 * In the past empty() used to accept only variables, now you can do stuff like:
 */
function always_false() {
  return false;
}
if (empty(always_false())) {
  echo "This will be printed.\n";
}
if (empty(true)) {
  echo "This will not be printed.\n";
}<?php
/*
 *  Gets a fully qualified name of class
 */
namespace Name\Space;
class ClassName {}
// outputs: Name\Space\ClassName
echo ClassName::class;For a full list of changes go here.