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.

Marcel dos Santos

October 18, 2016
Tweet

More Decks by Marcel dos Santos

Other Decks in Programming

Transcript

  1. Learning OOP in PHP Tutoriais, vídeos, slides, livros sobre OOP,

    OOD, design patterns, refatoração e arquitetura. bit.ly/Learning-OOP-in-PHP
  2. a checagem de tipo é um processo de verificação e

    garantia das restrições de tipos
  3. o erro de tipo ocorre se o programa executa uma

    operação com tipos incompatíveis
  4. 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;
  5. 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) {}
  6. 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
  7. 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)
  8. 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"] => …
  9. 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)
  10. 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
  11. 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
  12. 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
  13. 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)
  14. 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)
  15. 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(); }
  16. 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)
  17. 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
  18. 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