Resumo : neste tutorial, você aprenderá como definir propriedades digitadas adicionando dicas de tipo às propriedades da classe.
Introdução às propriedades digitadas em PHP
O exemplo a seguir define a BankAccount
classe com uma propriedade chamada $balance
:
class BankAccount
{
public $balance;
}
Linguagem de código: PHP ( php )
O valor padrão da $balance
propriedade é null
.
$account = new BankAccount();
var_dump($account->balance); // null
Linguagem de código: PHP ( php )
O PHP 7.4 permite que você digite dicas nas propriedades da classe com qualquer tipo, exceto void
e callable
. Por exemplo:
class BankAccount
{
public float $balance;
}
Linguagem de código: PHP ( php )
Neste exemplo, a $balance
propriedade tem o tipo float
. Ao adicionar o float
tipo à $balance
propriedade, o código a seguir causa um erro:
$account = new BankAccount();
var_dump($account->balance); // null
Linguagem de código: PHP ( php )
Erro:
Fatal error: Uncaught Error: Typed property BankAccount::$balance must not be accessed before initialization
Linguagem de código: texto simples ( texto simples )
Não funciona porque a $balance
propriedade agora não foi inicializada . O valor padrão da $balance
propriedade não é null
como antes. Observe que você ainda pode criar um novo objeto com propriedades digitadas não inicializadas.
Para ler uma propriedade digitada, você precisa inicializá-la primeiro. Por exemplo:
<?php
class BankAccount
{
public float $balance;
}
$account = new BankAccount();
$account->balance = 0;
var_dump($account->balance); // 0
Linguagem de código: PHP ( php )
Para propriedades com tipos escalares, você pode inicializá-las na declaração. Por exemplo:
<?php
class BankAccount
{
public float $balance = 0;
}
$account = new BankAccount();
var_dump($account->balance); // 0
Linguagem de código: PHP ( php )
Alternativamente, você pode inicializar as propriedades digitadas no construtor da classe:
<?php
class BankAccount
{
public float $balance = 0;
public function __construct(float $balance)
{
$this->balance = $balance;
}
}
$account = new BankAccount(100);
var_dump($account->balance); // 100
Linguagem de código: PHP ( php )
Se você cancelar a definição de uma propriedade digitada, seu status voltará para não inicializado. Observe que para uma propriedade não digitada, seu valor se tornará null
após a desdefinição. Por exemplo:
<?php
class BankAccount
{
public float $balance = 0;
public function __construct(float $balance)
{
$this->balance = $balance;
}
}
$account = new BankAccount(0);
var_dump($account->balance); // 0
unset($account->balance);
var_dump($account->balance); // error
Linguagem de código: PHP ( php )
Propriedades digitadas e tipos estritos
No exemplo a seguir, o construtor do BankAccount
expect a float
. No entanto, você pode passar uma string . Neste caso, o PHP força a string a um float:
<?php
class BankAccount
{
public float $balance = 0;
public function __construct(float $balance)
{
$this->balance = $balance;
}
}
$account = new BankAccount("100.5");
var_dump($account->balance); // 100.5
Linguagem de código: PHP ( php )
Caso não queira esse comportamento, você pode desabilitá-lo declarando strict_types
no início do arquivo o seguinte:
<?php
declare(strict_types=1);
class BankAccount
{
public float $balance = 0;
public function __construct(float $balance)
{
$this->balance = $balance;
}
}
$account = new BankAccount("100.25"); // error
var_dump($account->balance);
Linguagem de código: PHP ( php )
Erro:
Fatal error: Uncaught TypeError: Argument 1 passed to BankAccount::__construct() must be of the type float, string given.
Linguagem de código: texto simples ( texto simples )
Resumo
- As propriedades digitadas incluem modificadores (
private
,protected
epublic
) e tipos (excetovoid
ecallable
). - Propriedades digitadas têm estados não inicializados, e não nulos como propriedades não digitadas.