<slide title="PHP 5.6" section="php56">

<break lines="1" />
<link fontsize="2em" marginleft="0em" leader="" href="http://php.net/spec"/>

<break lines="1" section="php56variadic"/>
<blurb fontsize="4em">✔ Variadic functions</blurb>
<example result='0' title=""><![CDATA[<?php
class MySQL implements DB {
    public function query($query, ...$params) {
        $stmt = $this->pdo->prepare($query);
        $stmt->execute($params);
        return $stmt;
    }
}

$q = 'SELECT * FROM users WHERE id = ?';
$user = $db->query($q, $userID)->fetch();]]></example>

<break lines="1" section="php56unpack"/>
<blurb fontsize="4em">✔ Argument Unpacking</blurb>
<example result='0' title=""><![CDATA[<?php
// A better call_user_func_args
$args1 = [1, 2, 3];
$args2 = [4, 5, 6];
test(...$args1, ...$args2); // [1, 2, 3, 4, 5, 6]
test(1, 2, 3, ...$args2);   // [1, 2, 3, 4, 5, 6]
test(...$args1, 4, 5, 6);   // Fatal error: Cannot use positional argument after argument unpacking]]></example>

<break lines="1" section="php56constscalar"/>
<blurb fontsize="4em">✔ Constant scalar expressions</blurb>
<example result='0' title=""><![CDATA[<?php
class Foo {
    const FOO = 1 + 1;
    const BAR = 1 << 1;
    const GREETING = "HELLO";
    const BAZ = self::GREETING." WORLD!"
}]]></example>

<break lines="1" section="php56pow"/>
<blurb fontsize="4em">✔ Add right-associative power operator **</blurb>
<example result='0' title=""><![CDATA[<?php
echo 2 ** 3 ** 2; // 512 (not 64)
echo -3 ** 2; // -9 (not 9)
echo 1 - 3 ** 2; // -8
echo ~3 ** 2; // -10 (not 16)]]></example>

<break lines="1" section="php56opoverload"/>
<blurb fontsize="4em">✔ Internal operator overloading for internal features like GMP</blurb>
<example result='0' title=""><![CDATA[<?php
echo 2**512;
echo "\n";
$n = gmp_init(2);
echo $n**512;
]]></example>
<break lines="1" />
<example hide='1' result='1' title=""><![CDATA[
1.3407807929943E+154
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
]]></example>

<break lines="1" section="php56use"/>
<blurb fontsize="4em">✔ use function and use const namespace imports</blurb>
<example result='0' title=""><![CDATA[<?php
include 'template.inc';
include 'db.inc';
use function template\header, template\footer, db\query;

header('My Page');
query('select * from stuff');
footer(); ]]></example>

<break lines="1" section="php56_0"/>
<blurb fontsize="4em">✔ default_charset ini now applies to internal funcs</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ SSL Peer verification by default</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ openssl certificate fingerprints</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ SAN x509 ext matching when verifying host names</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ automatic DoS prevention of TLS renegotiation attacks</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ and many more openssl-related options</blurb>

<break lines="1" section="php56_1"/>
<blurb fontsize="4em">✔ Asynchronous PostgreSQL database connections</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ Non-blocking PostgreSQL queries</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ New phpdbg SAPI</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ Support for &gt; 2GB file uploads</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ The php://input stream is now re-usable</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ Added hash_equals() for timing attack safe string comparison</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ Added gost-crypto (CryptoPro S-box) hash algorithm</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ FPM workers can now change their apparmor profile</blurb>

<break lines="1" />
<blurb fontsize="4em">✔ OCI8 Improvements</blurb>

<break lines="1" section="php56_done"/>
<link href="http://php.net/migration56">php.net/migration56</link>

</slide>
