Propriedades digitadas em PHP

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 $balancepropriedade é null.

$account = new BankAccount();
var_dump($account->balance); // nullLinguagem de código:  PHP  ( php )

O PHP 7.4 permite que você digite dicas nas propriedades da classe com qualquer tipo, exceto voide callable. Por exemplo:

class BankAccount
{
    public float $balance;
}Linguagem de código:  PHP  ( php )

Neste exemplo, a $balancepropriedade tem o tipo float. Ao adicionar o floattipo à $balancepropriedade, o código a seguir causa um erro:

$account = new BankAccount();
var_dump($account->balance); // nullLinguagem de código:  PHP  ( php )

Erro:

Fatal error: Uncaught Error: Typed property BankAccount::$balance must not be accessed before initializationLinguagem de código:  texto simples  ( texto simples )

Não funciona porque a $balancepropriedade agora não foi inicializada . O valor padrão da $balancepropriedade não é nullcomo 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); // 0Linguagem 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); // 0Linguagem 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); // 100Linguagem 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á nullapó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); // errorLinguagem de código:  PHP  ( php )

Propriedades digitadas e tipos estritos

No exemplo a seguir, o construtor do BankAccountexpect 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.5Linguagem de código:  PHP  ( php )

Caso não queira esse comportamento, você pode desabilitá-lo declarando strict_typesno 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, protectede public) e tipos (exceto voide callable).
  • Propriedades digitadas têm estados não inicializados, e não nulos como propriedades não digitadas.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *