Davi Marcondes Moreira
Software developer, speaker, remote work and home office evangelist, MTB/XCO lover and coffee enthusiast.
Photo by Jordan Heinrichs on Unsplash
2019-10-19 @ PHPeste
Davi Marcondes Moreira - @devdrops
Evolua seu código!
> Davi Marcondes Moreira
> @devdrops
> Desenvolvedor de Software @ Pagar.me
> PHP, JavaScript, Kotlin, Go
> Terminal é puro ♥
> Defensor do home office e trabalho remoto
> Doido por MTB/XCO
> Café é a minha religião
Triângulo
Círculo
Quadrado
Boolean
Integers
Strings
Lanchas
Jetskis
Banhistas
Photo by Steve Johnson on Unsplash
Objetos
(PHP 5.0)
Arrays
(PHP 5.1)
Callable
(PHP 5.4)
Escalares
(PHP 7.0)
> boolean
> integer
> float
> string
> array
> object
> callable
> iterable
> resource
> null
> mixed
> number
> callback
> array|object
> void
Pseudo tipos
<?php
declare(strict_types=1);
<?php
declare(strict_types=1);
class Ryu
{
public function daRaduque(bool $value): bool {
return !$value;
}
}
function TaPegandoFogoBicho(float $value): float {
return $value*100;
}
<?php
require __DIR__ . '/exemplo1.php';
$ryu = new Ryu;
var_dump($ryu->daRaduque(true));
var_dump($ryu->daRaduque("true"));
var_dump(TaPegandoFogoBicho(2.5));
var_dump(TaPegandoFogoBicho(true));
// bool(false)
// bool(false)
// float(250)
// float(100)
<?php
declare(strict_types=1);
require __DIR__ . '/exemplo1.php';
$ryu = new Ryu;
var_dump($ryu->daRaduque(true));
var_dump($ryu->daRaduque("true"));
var_dump(TaPegandoFogoBicho(2.5));
var_dump(TaPegandoFogoBicho(true));
/*
bool(false)
PHP Fatal error: Uncaught TypeError: Argument 1 passed to
Ryu::daRaduque() must be of the type bool, string given,
called in /code/directive/exemplo3.php on line 8 and defined
in /code/directive/exemplo1.php:6
Stack trace:
#0 /code/directive/exemplo3.php(8): Ryu->daRaduque('true')
#1 {main}
thrown in /code/directive/exemplo1.php on line 6
*/
<?php
declare(strict_types=1);
function OlocoBixo(int $value)
{
var_dump($value);
}
$foo = 100;
OlocoBixo($foo);
// int(100)
<?php
declare(strict_types=1);
function OlocoBixo(int $value)
{
var_dump($value);
}
$foo = "100";
OlocoBixo($foo);
// Fatal error: Uncaught TypeError: Argument 1 passed to
// OlocoBixo() must be of the type int, string given, called
// in /code/exemplo2.php on line 10 and defined in
// /code/exemplo2.php:4
// Stack trace:
// #0 /code/exemplo2.php(10): OlocoBixo('100')
// #1 {main}
// thrown in /code/exemplo2.php on line 4
<?php
declare(strict_types=0);
function OlocoBixo(int $value)
{
var_dump($value);
}
$foo = "100";
OlocoBixo($foo);
// int(100)
<?php
declare(strict_types=1);
function Eita(): int
{
return 150;
}
var_dump(Eita());
// int(150)
<?php
declare(strict_types=1);
function Eita(): int
{
return 1.5;
}
var_dump(Eita());
// Fatal error: Uncaught TypeError: Return value of Eita() must be
// of the type int, float returned in /code/exemplo5.php:6
// Stack trace:
// #0 /code/exemplo5.php(9): Eita()
// #1 {main}
// thrown in /code/exemplo5.php on line 6
<?php
declare(strict_types=0);
function Eita(): int
{
return 1.5;
}
var_dump(Eita());
// int(1)
<?php
declare(strict_types=1);
class Foo {}
function Eita(): Foo
{
return true;
}
var_dump(Eita());
// Fatal error: Uncaught TypeError: Return value of Eita() must be
// an instance of Foo, bool returned in /code/exemplo7.php:8
// Stack trace:
// #0 /code/exemplo7.php(11): Eita()
// #1 {main}
// thrown in /code/exemplo7.php on line 8
<?php
declare(strict_types=0);
class Foo {}
function Eita(): Foo
{
return true;
}
var_dump(Eita());
// Fatal error: Uncaught TypeError: Return value of Eita() must be
// an instance of Foo, bool returned in /code/exemplo8.php:8
// Stack trace:
// #0 /code/exemplo8.php(11): Eita()
// #1 {main}
// thrown in /code/exemplo8.php on line 8
<?php
declare(strict_types=0);
interface Eita {
static function preula(): Eita;
}
class Batata implements Eita {
static function preula(): Batata { // Isso vai dar ruim
return new Batata;
}
}
Photo by Priscilla Du Preez on Unsplash
Em implementação para PHP 7.4
<?php
declare(strict_types=1);
class Foo {
/** @var string $name */
private $name;
public function __construct(string $name) {
$this->name = $name;
}
public function getName(): string {
return $this->name;
}
public function setName(string $name): void {
$this->name = $name;
}
}
<?php
declare(strict_types=1);
class Foo {
public string $name;
public function __construct(string $name) {
$this->name = $name;
}
}
<?php
declare(strict_types=1);
$foo = 100; // $foo é integer
$foo = false; // $foo é boolean
$foo = 1.1; // $foo é float
$foo = []; // $foo é array
$foo = "aycaramba"; // $foo é string
<?php
declare(strict_types=0);
$foo = 100;
var_dump($foo, gettype($foo));
// int(100) string(7) "integer"
$foo = false;
var_dump($foo, gettype($foo));
// bool(false) string(7) "boolean"
$foo = 1.1;
var_dump($foo, gettype($foo));
// float(1.1) string(6) "double"
$foo = [];
var_dump($foo, gettype($foo));
// array(0) {} string(5) "array"
$foo = "Oi Mãe, Tô No PHPeste :D";
var_dump($foo, gettype($foo));
// string(26) "Oi Mãe, Tô No PHPeste :D" string(6) "string"
$foo = "100";
var_dump($foo, gettype($foo));
// string(3) "100" string(6) "string"
- Tipos ajudam a tornar a intenção do código mais explícita, além de servir como excelente documentação.
- Oferecem garantia de contrato, sem necessidade de filtrar inputs com intval(), is_null() e outras funções.
- Não quebra compatibilidade com outras bibliotecas. É 100% compatível com a flexibilidade do PHP.
- Depende daquilo que você enxerga como problema.
- https://en.wikipedia.org/wiki/Strong_and_weak_typing
- https://wiki.php.net/rfc/return_types
- https://wiki.php.net/rfc/scalar_type_hints_v5
- https://wiki.php.net/rfc/typed_properties_v2
- https://www.php.net/manual/en/language.types.php
- https://blog.ircmaxell.com/2015/02/scalar-types-and-php.html
- https://blog.pascal-martin.fr/post/in-favor-of-rfc-scalar-type-hints/
bit.ly/tipos-php7-phpeste2019
@devdrops
https://forms.gle/N9qCRx2iJARPkuet6
By Davi Marcondes Moreira
Apresentação para o 4º Meetup do PHP Vale
Software developer, speaker, remote work and home office evangelist, MTB/XCO lover and coffee enthusiast.