Como lidar com strings complicadas no PHP

Autor: Cézar Augusto de Campos
15 de abril de 2020

Imagine que você é um programador PHP e precisa fazer uma consulta no banco de dados com um monte de variáveis, você começa a escrever a declaração SQL e percebe que a string é muito complicada.

Pois é, essa é uma situação que passei recentemente e percebi que o código fica muito bagunçado, se você não souber concatenar as strings de um jeito mais limpo. Para você entender o drama, dê uma olhada no código abaixo:

                
<?php
public function insert(Bill $bill, int $user_id) : bool
{
    $link = $this->link;
    $billetBanking = $link->real_escape_string($bill->getBilletBanking());
    $sql = "INSERT INTO `bill` (`description`, `price`, `expirationDate`, `barCode`, `billetBanking`, `paid`) ".
    "VALUES ('".$bill->getDescription()."', '".$bill->getPrice()."', '".$bill->getExpirationDate()."', '".$bill->getBarCode()."', ".
    "'".$billetBanking."', CONV('0', 2, 10) + 0)";
    $link->query($sql);
    return $this->addRelation($user_id);
}
?>
                
        

Eu quero você repare na variável "$sql", olhe quantas linhas, pontos, aspas duplas e simples, eu tive que adicionar para formar a variável final. É uma parte do código difícil de olhar, pois é um balaio de gato, até mesmo um espaço fora do lugar poderia parar o sistema todo e mostrar um erro.

Se eu imprimisse a variável, ela ficaria assim:

                INSERT INTO `bill` (`description`, `price`, `expirationDate`, `barCode`, `billetBanking`, `paid`) VALUES ('Conta de luz', '220', '2020-05-04', NULL, 'um monte de dados binários aqui', CONV('0', 2, 10) + 0)
        

Nada demais, esse era o resultado que eu queria chegar, porém como dizia o Robert C. Martin em seu livro Clean Code, "nenhuma parte do código deve ser ignorada", então volta e meia eu teria que voltar nessa parte para fazer alguma manutenção.

Pois bem, o PHP processa todas as variáveis dentro de chaves {} em uma string, não é necessário fechar a string para adicionar o valor com um ponto.

Outra coisa que me ajudou, é que ao quebrar as linhas de uma string, o PHP não vai quebrar a linha no resultado final, para isso você tem que colocar "\n". Se não colocar "\n", o PHP vai ajuntar tudo em uma linha só.

Exemplo:

                
<?php
$msg = "
O
l
a

m
u
n
do";
echo $msg;
// Vai imprimir
// O l a m u n do
?>
                
        

No fim, a variável complicada ficou desse jeito aqui:

                
$sql = "INSERT INTO `bill` (`description`, `price`, `expirationDate`,
        `barCode`, `billetBanking`, `paid`)
        VALUES ('{$bill->getDescription()}', '{$bill->getPrice()}',
        '{$bill->getExpirationDate()}', '{$bill->getBarCode()}', '{$billetBanking}',
        CONV('0', 2, 10) + 0)";
                
        

Versus versão anterior:

                
$sql = "INSERT INTO `bill` (`description`, `price`, `expirationDate`, `barCode`, `billetBanking`, `paid`) ".
        "VALUES ('".$bill->getDescription()."', '".$bill->getPrice()."', '".$bill->getExpirationDate()."', '".$bill->getBarCode()."', ".
        "'".$billetBanking."', CONV('0', 2, 10) + 0)";
                
        

Com isso, eu evitei os problemas de concatenar strings com o ponto e todo aquele bolo de aspas duplas e simples.

Essa dica foi testada no PHP 7.3 no Debian Bullseye.

Over and out!