Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

52711e2157a6fed933b0361cc06a6953?s=128

Marcel dos Santos

October 18, 2016
Tweet

Transcript

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

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

  3. None
  4. @phpsp phpsp.org.br

  5. @femugsp sp.femug.com

  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
  7. O que são tipos?

  8. conjunto de valores

  9. valores são agrupados por tipos

  10. define quais operações podem ser efetuadas

  11. possui cardinalidade

  12. forma como o valor é armazenado e recuperado

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

  14. define o significado semântico do valor

  15. O que é sistema de tipos?

  16. ajuda a reduzir possibilidade de erros

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

  18. funciona como documentação

  19. pode ser interno ou externo a linguagem

  20. Como os tipos podem ser classificados?

  21. primitivo, composto ou recursivo

  22. tipagem estática ou dinâmica

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

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

    ser tipadas
  25. tipagem forte ou fraca

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

    sempre erros
  27. tipagem fraca os tipos mudam implicitamente e tipos inválidos são

    convertidos automaticamente
  28. Operações comuns relacionadas à tipos

  29. a checagem de tipo é um processo de verificação e

    garantia das restrições de tipos
  30. a checagem de tipo pode ser executada em tempo de

    compilação ou execução
  31. o erro de tipo ocorre se o programa executa uma

    operação com tipos incompatíveis
  32. a coerção é a conversão automática de tipos

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

    os tipos
  34. Como os tipos funcionam no PHP?

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

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

  37. compostos array, object ou callable Exemplo 2

  38. especiais resource e null Exemplo 3

  39. também existem os pseudo-tipos

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

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

  42. as funções var_dump e gettype são utilizadas para conhecer o

    tipo da variável ou expressão
  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;
  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) {}
  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
  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
  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)
  48. conversão explícita e automática

  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"] => …
  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)
  51. type hints 1. tipos escalares 2. classes e interfaces 3.

    arrays e callables
  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
  53. modo estrito

  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
  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
  56. declaração de tipos de retorno

  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)
  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)
  59. TypeError é lançado caso tenha problemas de tipo

  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(); }
  61. operadores de tipo

  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)
  63. Como os tipos funcionam na Hack?

  64. a linguagem Hack possui tipagem forte

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

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

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

    aliases
  68. O que vem por aí?

  69. o nullable type permite que seja utilizado um valor do

    tipo especificado ou nulo
  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
  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
  72. tipo de retorno void

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

  74. Avalie!

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

  76. Perguntas?

  77. Obrigado. @marcelgsantos speakerdeck.com/marcelgsantos