Recursos do PHP que talvez você não conheça, mas deveria

·

5 min read

O PHP é uma linguagem que está em constante evolução e a cada nova versão diversos novos recursos são incluídos nela, porém, devido a uma série de fatores: comodismo, desconhecimento, falta de interesse, etc. Muitos programadores acabando simplesmente não utilizando esses recursos, abrindo mão assim de funcionalidades muito úteis e que facilitariam muito o seu trabalho. Vamos conhecer alguns desses recursos?

Traits

Algumas linguagens de programação implementam um recursos chamado Herança Múltipla, que permite que uma classe herde de duas ou mais classes. PHP é uma das linguagens que não permitem esse tipo de abordagem porém podemos contornar isso, mesmo que parcialmente, com o uso de Traits.

Traits foram incluídas no PHP na versão 5.4 e podemos entende-las como um conjunto de métodos, semelhantes a uma class (em sua estrutura), que permitem que nos programadores reutilizemos conjuntos de métodos livremente em várias classes independentes.

Exemplo:

<?php

trait Saudacao
{
    private $saudacoes = ["m" => "Sr.", "f" => "Sra."];

    function saudar($sexo) {
        return $this->saudacoes[$sexo];
    }
}

class Pessoa
{
    use Saudacao;

    private $nome;
    private $sexo;

    public function __construct($nome, $sexo) {
        $this->nome = $nome;
        $this->sexo = $sexo;
    }

    public function dizerOla() {
        printf("Olá %s %s", $this->saudar($this->sexo),  $this->nome);
    }
}

$pessoa = new Pessoa("Paulo", "m");
$pessoa->dizerOla();

String Literal Dereferencing

Apesar do nome grande, o recurso é bem simples. Desde a versão 5.5 do PHP podemos acessar posições de uma string usando a sintaxe de Array.

Exemplo

// Será impresso o caractere "D"
echo "Acampamento Dev"[12];

list

É um recurso bem antigo que está disponível no PHP desde a versão 4, mas é ainda hoje pouco utilizado. List pode ser usado para criar uma lista de variáveis em apenas uma operação. Para quem já programa em Javascript, esse recurso pode parecer muito familiar com a desestruturação.

<?php

$palavras = ["Paulo", "Reis"];

list($nome, $sobrenome) = $palavras;

echo "Olá $nome $sobrenome";

Spread Operator

Este recurso também é conhecido como Argument Unpacking (Desempacotamento de argumentos) e serve para "espalhar" itens de um Array dentro de outro Array, como parametros de funções, etc...

<?php

$palavras = ["Paulo", "Reis"];

function dizerNomeCompleto($nome, $sobrenome) {
    echo "Olá $nome $sobrenome";
}

// funciona como: dizerNomeCompleto("Paulo", "Reis");
dizerNomeCompleto(...$palavras);

Declaração de Tipos

O PHP é uma linguagem dinâmica e que faz inferência de tipos, ou seja, se você criar uma variável e atribuir a ela uma string, a partir daquele momento o PHP vai tipar ela dinamicamente como uma string, porém se em outro momento você pegar essa mesma variável e atribuir a ela um inteiro, o PHP irá tipar ela como sendo inteiro. Essa característica é vista com maus olhos por programadores de outras linguagens, mas isso não é uma coisa ruim se você entender como tudo isso funciona. Porém em alguns momentos pode ser interessante taiparmos explicitamente as coisas. Então o PHP desde a versão 7.0 vem trazendo alguns recursos legais a cerca disso.

Exemplo:

<?php

declare(strict_types=1);

function calcularBonus(float $salario, int $percentualAumento): float {
    return $salario + ($salario * $percentualAumento / 100);
}

echo calcularBonus("8000", 10);

No código acima o comando declare(strict_types=1); informa ao PHP que queremos que ele leve em consideração explicitamente o tipo definido para os parâmetros e retorno das funções.

Como usamos string no código acima, um erro será lançado ao executa-lo

Fatal error: Uncaught TypeError: Argument 1 passed to calcularBonus() must be of the type float, string given, called in /home/runner/CursoPHPAcampamentoDev/main.php on line 9 and defined in /home/runner/CursoPHPAcampamentoDev/main.php:5
Stack trace:
#0 /home/runner/CursoPHPAcampamentoDev/main.php(9): calcularBonus('8000', 10)
#1 {main}
  thrown in /home/runner/CursoPHPAcampamentoDev/main.php on line 5
exit status 255

Null Coalesce Operator

O operador de coalescência nulo foi adicionado ao PHP na versão 7.0, ele serve para devolver um valor alternativo quando uma variável tiver valor null.

<?php

$nome = null;

// Usando ternários
echo "Nome: " . (!is_null($nome) ? $nome : "Não informado");

// Usando Null Coalesce Operator
echo "Nome: " . ($nome ?? "Não informado");

Arrow functions

Novamente temos aqui um recurso presente no Javascript que está disponível no PHP desde a versão 7.4. Basicamente é uma forma curta de escrever funções anônimas.

<?php

$frutas = ["Maçã", "Melancia", "Uva", "Banana"];

$frutasComInicialM = array_filter($frutas, fn ($fruta) => $fruta[0] === "M");

print_r($frutasComInicialM);

Nullsafe operator

Mais um recurso velho conhecido dos programadores Javascript que agora com o PHP 8 está disponível também para a nós.

Basicamente esse operador analisa se o objeto e null e só prossegue com a ação se ele não for. Isso evita que nosso código quebre se algum método ou variável devolver null ao invés de um objeto.

<?php

class Financeiro
{
    public function obterPedido(): ?Pedido { }
}

$financeiro = new Financeiro();
echo $financeiro->obterPedido()?->obterId();

Argumentos nomeados

Esse é um dos recursos mais interessantes que você verá hoje. Argumentos nomeados permitem que você passe valores para uma função, especificando o nome do valor, para que você não precise levar em consideração sua ordem, e também pode pular parâmetros opcionais!

<?php

function saudar($nome, ?string $sexo = null, ?bool $uppercase = false) {
    $saudacao = "";

    if ($sexo === "m") {
        $saudacao .= "Sr. ";
    } else if ($sexo === "f") {
        $saudacao .= "Sra. ";
    }

    $saudacao .= $nome;

    if ($uppercase) {
        $saudacao = strtoupper($saudacao);
    }

    return $saudacao;
}

echo saudar("Paulo", uppercase: true);

str_starts_with(), str_ends_with() e str_contains()

Essas 3 novas funções são bem legais e simplificam a análise de strings. Elas respectivamente verificam se: Uma string inicia com uma substring, termina com uma substring ou contem uma substring.

Exemplo:

<?php

$string = "Acampamento Dev";
$procurarPor = "Acamp";

var_dump(str_starts_with($string, $procurarPor));
var_dump(str_ends_with($string, $procurarPor));
var_dump(str_contains($string, $procurarPor));

Resultado:

bool(true)
bool(false)
bool(true)

E ai, alguma dessas eram novidades para você? Já estava usando no seu dia-a-dia? Conta pra mim ai nos comentários 😉