Há muito tempo, em uma internet muito, muito distante…

PHPPHP Hypertext Processor

Episódio VII
O Despertar da Força Web

É um período de guerra.

Várias linguagens tentam se sobrepor umas as outras para serem as mais usadas na galáxia web.

Depois de um período de paz, a Primeira Ordem surge com várias linguagens de programação para tentar derrubar a hegemonia e soberania que o PHP conquistou, com mais de 80% da web.

Contudo, o conselho do PHP, começa a criar uma nova arma, o PHP 7. Mais rápido, mais seguro, mais uniforme, pode juntar os povos ao redor dessa nova maravilha1

Inicia-se, então, a distribuição do PHP 7 pela galáxia com várias possibilidades de novas conquistas e aventuras!

Padawans?

Como web apps funcionam?

HTTP

???

         

X, Y, Z

Request


                                GET /hello.html HTTP/1.1
                        

Response


                                HTTP/1.1 200 OK
                                Content-Length: 88
                                Content-Type: text/html
                                <html>
                                    <body>
                                        <h1>Hello, World!</h1>
                                    </body>
                                </html>
                        

PHP???

??????

Use your anger!!

Request


                                GET /hello.php HTTP/1.1
                        

PHP


                                <html>
                                    <body>
                                    <h1><?php echo "Hello, World!"; ?></h1>
                                    </body>
                                </html>
                        

Response


                                HTTP/1.1 200 OK
                                Content-Length: 88
                                Content-Type: text/html
                                <html>
                                    <body>
                                        <h1>Hello, World!</h1>
                                    </body>
                                </html>
                        

George Lucas

Rasmus Lerdorf

PHP/FIEpisódio I - A Ameaça Fantasma

Me say no more!!

PHP 2Episódio II - Ataque dos Clones

PHP 3PHP Hypertext ProcessorEpisódio III - A Vingança dos Sith

Darth Andi
Darth Zeev

PHP 4Episódio IV - Uma Nova Esparança

Zend Engine knows the Force!!!

PHP 5Episódio V - O Império Contra-ataca

Aprende novos truques...

Mexe com objetos

(padawan style)

Inicia sua campanha para ganhar a galáxia (web)!!!

Mas...

Termina com muitas novidades!!

(5.1, 5.2, 5.3, 5.4, 5.5 e 5.6)

PHP 6Episódio VI - O Retorno dos que não foram de Jedi

Tentaram enfeitar demais!!!
Mesmo assim, foi um caminho de aprendizado e maturidade

PHP 7 Episódio VII - O Despertar da Força Web

Parece que se foram realmente 30 anos!!
Melhorou a performance!!!

http://talks.php.net/fluent15#/boxspecs

Abstract Syntax Tree

Parâmetros e Retornos de função não são todos clones mais...

Podem ser especificados!!!


<?php
    declare(strict_types=1);

    function soma(int $a, int $b): int {
        return $a + $b;
    }
                        

Sugar Syntax


<?php
    $nome = $_GET['nome'] ?? 'Anônimo';
    $users = User::findAll() ?? null;
                        

Null Coallesce Operator


<?php
    // AO INVÉS DISSO...
    function cmp($a, $b)
    {   
        if ($a == $b) {
        return 0;
        }
        return ($a < $b) ? -1 : 1;
    }

    // ISSO
    function cmp($a, $b)
    {   
        return $a <=> $b;
    }
                        

Spaceship Operator

<=>


<?php
    use \Namespace\{Classe1, Classe2};
    use function \Namespace\{exibirVar, sortear};
    use const \Namespace\{ABC, XYZ};
                        

Agrupamento do USE

Classes Anônimas

(coadjuvante de luxo)

Capitã Phasma


<?php
    class User
    {
        private $name;
        private $surname;

        public function __construct(string $name, string $surname)
        {
            $this->name = $name;
            $this->surname = $surname;
        }

        public function getCompleteName(): string
        {
            return 'Meu nome é ' . $this->name . ' ' . $this->surname;
        }
    }

    $nome_completo = (new User('Luke', 'Skywalker'))->getCompleteName();
    echo $nome_completo;
        ====> EXIBE 'Meu nome é Luke Skywalker'
                        

Já podia fazer isso...


<?php
    $nome_completo = (new class('Luke', 'Skywalker') {
        private $name;
        private $surname;

        public function __construct(string $name, string $surname)
        {
            $this->name = $name;
            $this->surname = $surname;
        }

        public function getCompleteName(): string
        {
            return 'Meu nome é ' . $this->name . ' ' . $this->surname;
        }
    })->getCompleteName();
    echo $nome_completo;
        ====> EXIBE 'Meu nome é Luke Skywalker'
                        

Agora pode fazer isso também!!!

Unserialize Filter


<?php
    $safe_area = unserialize($hyperspace_travel, [
        "allowed_classes" => [
            "NoMeteorCloudClass",
            "NoEmpireClass"
        ]
    ]);

    $any_area = unserialize($hyperspace_travel, ["allowed_classes" => true]);
    $safest_area = unserialize($hyperspace_travel, ["allowed_classes" => false]);
                        
"Travelling through hyperspace ain't dusting crops, boy!"
Han Solo

Generators

Delegação e Retorno


<?php
    $checkDeathStarVulnerability =  function (string $port)
    {
        $vulnerability = false;
        if ($port === 'DEATHSTAR EXHAUST PORT') {
            yield "$port HAS NO VULNERABILITY!";
        } else {
            $vulnerability = true;
            yield "VULNERABILITY FOUND AT $port!"; 
        }
        
        return $vulnerability;
    };
                        

<?php
    $readDeathStarBlueprint = function (string $deathstar) use ($checkDeathStarVulnerability)
    {
        if (!$deathstarHandle = fopen($deathstar, 'r')) {
           return 'WRONG BLUEPRINT!';
        }

        $vulnerability = false;
        while (false !== ($port = fgets($deathstar)))
        {
            yield from $checkDeathStarVulnerability($port);
            $vulnerability = $checkDeathStarVulnerability->getReturn();
        }

        return ($vulnerability) ? "ATTACK IMMEDIATELY!!!" : "IT'S A TRAP!!!"
    }
                        

<?php
    foreach ($readDeatStarBlueprint('/path/to/deathstar/blueprints.txt') as $port)
        echo $port;

    echo $readDeatStarBlueprint->getReturn();
                        

Fatal Errors Exceptions


<?php
    class Jedi
    {
        public function train()
        {
            return "Use the Force";
        }
    }

    class Sith
    {
        public function train()
        {
            return "Use your anger";
        }
    }

    function jediTraining(Jedi $anybody)
    {
        return $anybody->train();
    }
                        

<?php
    try {
        $luke = new Jedi();
        $vader = new Sith();
        jediTraining($luke);
        jediTraining($vader);
    } catch (\TypeError $e) {
        echo "ERROR: ". $e->getMessage();
        echo "LINE: " . $e->getLine();
    }
                        

ERROR: Argument 1 passed to jediTraining() must be an instance of Jedi, instance of Sith given, called in errortype.php on line 28
LINE: 18

LEMBRE-SE: se for testar valores primitivos, usar a declaração de strict types!

<?php
    try {
        $valor = intdiv(1, 0);
    } catch (\DivisionByZeroError $e) {
        echo "ERROR: ". $e->getMessage();
        echo "LINE: " . $e->getLine();
    }
                        

ERROR: Division by zero
LINE: 3

O que vem (ou pode vir) por aí...

Em discussão/Rascunho (draft)

Aceito/Implementado

                            
<?php
    function compassionInPalpatinesHeart: void {
        return false; // Fatal error: Void deve não ter retorno!!!
    }
                            
                        

Retorno de função/método void

                            
<?php
    $y = 'Leia';
    // ANTES
    $vaders_sons = function($x) use ($y) {
        return $x . ' and ' . $y;
    };
    $vaders_sons('Luke');
    // DEPOIS
    $vaders_sons = function($x) => $x . ' and ' . $y;
    $vaders_sons('Luke');
                            
                        

Arrow Functions

                            
<?php
    enum DeathStars {
        DeathStar1,
        DeathStar2,
        Starkiller
    }
    
    switch ($type) {
        case DeathStars::DeathStar1:
            echo "NICE!! A vulnerability exists in the exhaustion port!!";
            break;
        case DeathStars::DeathStar2:
            echo "ALMOST NICE!! Vulnerability still exists, but has a force shield";
            break;
        case DeathStars::Starkiller:
            echo "REALLY??!! Exhaustion port AGAIN??!!";
            break;
        case 
    }
                            
                        

Tipos Enumerados

                            
<?php
    class Ship<Config, ShipName>
    {
        private $config;
        private $name;

        public function __construct(Config $config, ShipName $name)
        {
            $this->config = $config;
            $this->name = $name;
        }
    }
    
    $battle_ship = new Ship<string, string>('photon canon', 'X-Wing');
    $transport_ship = new Ship<int, string>(100, 'Imperial Military Transport');
                            
                        

Tipos Genéricos

Suporte a HTTP/2 e server push

                            
<?php
    foreach ($jedis as $jedi) {
        echo "Kylo Ren kills {$jedi->name}";
    } else {
        echo "No more jedis!";
    }
                            
                        

Loop + Else

                            
<?php
    function ReyUsesTheForce($phrase, $gesture = null, $concentration = 5) { ... }
    
    ReyUsesTheForce("You'll release me now!", null, 3);
    ReyUsesTheForce("You'll release me now!", { concentration: 10});
    
                            
                        

Parâmetros nomeados

                            
<?php
    class DarthVader extends Jedi implements Sith {
        public int $number_of_childs;
        public string $light_saber_color;
    }
                            
                        

Atributos de classe tipados

OBRIGADO!

Marcio Albuquerque
marcio.lima.albuquerque@gmail.com
@mlalbuquerque

May the Force be with you