$30 off During Our Annual Pro Sale. View Details »

Introdução a Tipos em PHP

Introdução a Tipos em PHP

O conceito de tipos é muito importante para as linguagens de programação e dominá­-lo é essencial para a produção de códigos de qualidade. Porém, este conceito é, muitas vezes, incompreendido por muitos programadores. Nesta palestra serão apresentadas a definição de tipos, sistema de tipos, tipagem estática e dinâmica, tipagem forte e fraca, como funciona o sistema de tipos em PHP, novidades do PHP 7 em relação à tipos (scalar type hints, declaração de tipos de retorno e tipagem estrita), como funciona o sistema de tipos em Hack, vantagens e desvantagens na utilização de tipos em linguagens de programação e qual é o futuro do PHP em relação à tipos.

Marcel dos Santos

October 18, 2016
Tweet

More Decks by Marcel dos Santos

Other Decks in Programming

Transcript

  1. Marcel Gonçalves dos Santos
    @marcelgsantos
    T Introdução a
    Tipos em PHP

    View Slide

  2. pensandonaweb.com.br
    desenvolvedor web full-stack
    Marcel Gonçalves dos Santos
    @marcelgsantos

    View Slide

  3. View Slide

  4. @phpsp
    phpsp.org.br

    View Slide

  5. @femugsp
    sp.femug.com

    View Slide

  6. Learning OOP in PHP
    Tutoriais, vídeos, slides, livros sobre OOP, OOD,
    design patterns, refatoração e arquitetura.
    bit.ly/Learning-OOP-in-PHP

    View Slide

  7. O que são tipos?

    View Slide

  8. conjunto de valores

    View Slide

  9. valores são agrupados por
    tipos

    View Slide

  10. define quais operações
    podem ser efetuadas

    View Slide

  11. possui cardinalidade

    View Slide

  12. forma como o valor é
    armazenado e recuperado

    View Slide

  13. não é só sobre espaço
    ocupado na memória

    View Slide

  14. define o significado
    semântico do valor

    View Slide

  15. O que é
    sistema de tipos?

    View Slide

  16. ajuda a reduzir
    possibilidade de erros

    View Slide

  17. permite otimização em
    tempo de execução

    View Slide

  18. funciona como
    documentação

    View Slide

  19. pode ser interno ou
    externo a linguagem

    View Slide

  20. Como os tipos podem
    ser classificados?

    View Slide

  21. primitivo, composto ou
    recursivo

    View Slide

  22. tipagem estática ou
    dinâmica

    View Slide

  23. tipagem estática
    todos os atributos,
    parâmetros e retornos de
    funções devem ser tipadas

    View Slide

  24. tipagem dinâmica
    nenhum atributo, parâmetro
    ou retornos de funções
    precisam ser tipadas

    View Slide

  25. tipagem forte ou fraca

    View Slide

  26. tipagem forte
    os tipos mudam
    explicitamente e tipos
    inválidos são sempre erros

    View Slide

  27. tipagem fraca
    os tipos mudam
    implicitamente e tipos
    inválidos são convertidos
    automaticamente

    View Slide

  28. Operações comuns
    relacionadas à tipos

    View Slide

  29. a checagem de tipo é um
    processo de verificação e
    garantia das restrições de
    tipos

    View Slide

  30. a checagem de tipo pode
    ser executada em tempo de
    compilação ou execução

    View Slide

  31. o erro de tipo ocorre se o
    programa executa uma
    operação com tipos
    incompatíveis

    View Slide

  32. a coerção é a conversão
    automática de tipos

    View Slide

  33. a inferência de tipos permite
    que o programador não
    explicite os tipos

    View Slide

  34. Como os tipos
    funcionam no PHP?

    View Slide

  35. são divididos em tipos
    escalares, compostos e
    especiais

    View Slide

  36. escalares
    boolean, integer, float ou
    string
    Exemplo 1

    View Slide

  37. compostos
    array, object ou callable
    Exemplo 2

    View Slide

  38. especiais
    resource e null
    Exemplo 3

    View Slide

  39. também existem os
    pseudo-tipos

    View Slide

  40. pseudo-tipos
    mixed, number, callback,
    array|object e void
    Exemplo 4

    View Slide

  41. os tipos são definidos em
    tempo de execução

    View Slide

  42. as funções var_dump e
    gettype são utilizadas para
    conhecer o tipo da variável
    ou expressão

    View Slide

  43. Exemplo 5
    // Define variáveis de diversos tipos
    $a_boolean = true;
    $an_int = 10;
    $a_float = 3.14;
    $a_string = 'joe';
    $a_null = null;
    $a_array = [];
    $a_callable = function() { return 'Hey!'; };
    $a_object = new stdClass;

    View Slide

  44. Exemplo 6
    // Obtém o valor e o tipo das variáveis
    // utilizando a função var_dump()
    var_dump($a_boolean); // bool(true)
    var_dump($an_int); // int(10)
    var_dump($a_float); // float(3.14)
    var_dump($a_string); // string(3) "joe"
    var_dump($a_null); // NULL
    var_dump($a_array); // array(0) {}
    var_dump($a_callable); // object(Closure)#1 (0) {}
    var_dump($a_object); // object(stdClass)#2 (0) {}

    View Slide

  45. Exemplo 7
    // Obtém o tipo das variáveis utilizando a
    // função gettype()
    echo gettype($a_boolean) . PHP_EOL; // boolean
    echo gettype($an_int) . PHP_EOL; // integer
    echo gettype($a_float) . PHP_EOL; // double
    echo gettype($a_string) . PHP_EOL; // string
    echo gettype($a_null) . PHP_EOL; // NULL
    echo gettype($a_array) . PHP_EOL; // array
    echo gettype($a_callable) . PHP_EOL; // object
    echo gettype($a_object) . PHP_EOL; // object

    View Slide

  46. as funções is_int, is_boolean,
    is_string, is_array são utiliza-
    das para verificar o tipo da
    variável ou expressão

    View Slide

  47. Exemplo 8
    // Verifica se as variáveis são de determinado
    // tipo utilizando as funções is_*()
    var_dump(is_bool($a_boolean)); // bool(true)
    var_dump(is_bool($an_int)); // bool(false)
    var_dump(is_int($an_int)); // bool(true)
    var_dump(is_int($a_float)); // bool(false)
    var_dump(is_float($a_float)); // bool(true)
    var_dump(is_float($a_string)); // bool(false)
    var_dump(is_string($a_string)); // bool(true)
    var_dump(is_string($a_null)); // bool(false)
    var_dump(is_null($a_null)); // bool(true)
    var_dump(is_null($a_array)); // bool(false)

    View Slide

  48. conversão explícita e
    automática

    View Slide

  49. Exemplo 9
    // Conversão de valores entre tipos
    var_dump((bool) "1.5"); // bool(true)
    var_dump((int) "1.5"); // int(1)
    var_dump((float) "1.5"); // float(1.5)
    var_dump((unset) "1.5"); // NULL
    var_dump((string) 1.5); // string(3) "1.5"
    var_dump((array) 1.5);
    // array(1) { [0] => float(1.5) }
    var_dump((array) "1.5");
    // array(1) { [0] => string(3) "1.5" }
    var_dump((object) 1.5);
    // object(stdClass)#1 (1) {["scalar"] => …
    var_dump((object) "1.5");
    // object(stdClass)#1 (1) {["scalar"] => …

    View Slide

  50. Exemplo 10
    // Conversão automática de tipos utilizando
    // o operador de adição
    $var = "0";
    var_dump($var); // string(2) "0"
    $var += 5;
    var_dump($var); // int(5)
    $var = $var + 3.1;
    var_dump($var); // float(8.1)
    $var = 5 + "10 cachorros";
    var_dump($var); // int(15)

    View Slide

  51. type hints
    1. tipos escalares
    2. classes e interfaces
    3. arrays e callables

    View Slide

  52. Exemplo 11
    // Declaração de tipos utilizando classes
    class Mammal {}
    class Cat extends Mammal {}
    class Duck {}
    function sayHi(Mammal $mammal) {
    echo 'Hi ' . get_class($mammal) . '!';
    }
    sayHi(new Mammal); // Hi Mammal!
    sayHi(new Cat); // Hi Cat!
    // sayHi(new Duck); // PHP Fatal error: Uncaught
    TypeError: Argument 1 passed to sayHi() must be
    an instance of Mammal, instance of Duck given

    View Slide

  53. modo estrito

    View Slide

  54. Exemplo 12
    declare(strict_types=0);
    // conversão do tipo float para inteiro
    function sum(int $a, int $b) {
    return $a + $b;
    }
    var_dump(sum(1, 2)); // int(3)
    var_dump(sum(1.5, 2.5)); // int(3)
    var_dump(sum("2", "5")); // int(7)
    var_dump(sum(true, true)); // int(2)
    var_dump(sum("2 gatos", "3 ratos")); // int(5)
    PHP Notice: A non well formed numeric value
    encountered

    View Slide

  55. Exemplo 13
    declare(strict_types=1);
    // dispara uma exceção quando são informados
    // valores que não são dos tipos declarados
    function sum(int $a, int $b) {
    return $a + $b;
    }
    var_dump(sum(1, 2)); // int(3)
    // var_dump(sum(1.5, 2.5)); // PHP Fatal error:
    Uncaught TypeError: Argument 1 passed to sum()
    must be of the type integer, float given

    View Slide

  56. declaração de tipos de
    retorno

    View Slide

  57. Exemplo 14
    // O valor de retorno é convertido para o tipo
    // correto caso não sejam do tipo informado
    function sum($a, $b): int {
    return $a + $b;
    }
    var_dump(sum(1, 2)); // int(3)
    var_dump(sum(1.7, 2.5)); // int(4)
    var_dump(sum(true, true)); // int(2)
    var_dump(sum("3 peixes", "5 patos")); // int(8)

    View Slide

  58. Exemplo 15
    declare(strict_types=1);
    // A função dispara uma exceção quando são infor-
    // mados valores que não são dos tipos declarados
    function sum($a, $b): int {
    return $a + $b;
    }
    var_dump(sum(1, 2)); // int(3)
    // var_dump(sum(1.7, 2.5)); // PHP Fatal error:
    Uncaught TypeError: Return value of sum()
    must be of the type integer, float
    var_dump(sum(true, true)); // int(2)
    var_dump(sum("3 peixes", "5 patos")); // int(8)

    View Slide

  59. TypeError é lançado caso
    tenha problemas de tipo

    View Slide

  60. Exemplo 16
    declare(strict_types=1);
    // Capturando erro
    try {
    var_dump(sum(1, 2)); // int(3)
    var_dump(sum(...[4, 5])); // int(9)
    var_dump(sum(1.5, 2.5)); // Error: Return
    value of sum() must be of the type integer,
    float returned
    } catch (TypeError $e) {
    echo 'Error: ' . $e->getMessage();
    }

    View Slide

  61. operadores de tipo

    View Slide

  62. Exemplo 17
    // Utilização do operador de tipos `instanceof`
    class Cat {}
    class Dog {}
    $cat = new Cat;
    var_dump($cat instanceof Cat); // bool(true)
    var_dump($cat instanceof Dog); // bool(false)

    View Slide

  63. Como os tipos
    funcionam na Hack?

    View Slide

  64. a linguagem Hack possui
    tipagem forte

    View Slide

  65. na linguagem Hack declara-
    se o tipo de membros de
    classe

    View Slide

  66. possui verificação estática
    de tipos

    View Slide

  67. possui diferentes tipos
    como tipos genéricos,
    tuplas, conjuntos e type
    aliases

    View Slide

  68. O que vem por aí?

    View Slide

  69. o nullable type permite que
    seja utilizado um valor do
    tipo especificado ou nulo

    View Slide

  70. Exemplo 18
    // No PHP 7.0 funções não aceitam valores
    // nulos como argumento
    function increment(int $a) {
    return $a + 1;
    }
    var_dump(increment(8)); // int(9)
    // var_dump(increment(null)); // TypeError:
    Argument 1 passed to increment() must be of
    the type integer, null given

    View Slide

  71. Exemplo 19
    // No PHP 7.1 funções aceitam nulos como
    // argumento utilizando ? antes do nome do tipo
    function increment2(?int $a) {
    return $a + 1;
    }
    var_dump(increment2(5)); // int(9)
    var_dump(increment2(null)); // int(1)
    // var_dump(increment2()); // PHP Fatal error:
    Uncaught ArgumentCountError: Too few arguments
    to function increment2(), 0 passed

    View Slide

  72. tipo de retorno void

    View Slide

  73. submissão de RFCs sobre
    union types e genéricos

    View Slide

  74. Avalie!

    View Slide

  75. https:/
    /joind.in/talk/b6fad

    View Slide

  76. Perguntas?

    View Slide

  77. Obrigado.
    @marcelgsantos
    speakerdeck.com/marcelgsantos

    View Slide