PHP para Iniciantes: Funções - Internas (built-in)

Olá, quanto tempo! Fiquei alguns dias sem escrever aqui no blog, porque nessa época de Black Friday eu preciso atuar em diferentes escalas. Com isso, posso dizer que minhas forças se esgotam assim que "saio do trabalho". Mas não abandonei vocês! Quem me acompanha pelo meu perfil do Twitter ficou sabendo de antemão que eu daria uma pausa, só pequei em não vir avisar aqui, né? Já foi, foi mal.

E falando no artigo de hoje, eu já te dei uma breve introdução sobre o que é uma função e para que serve no artigo anterior, certo? Antes de te ensinar a escrever sua própria função, eu preciso te explicar sobre as funções internas do PHP. Essa não é exatamente a ordem de conteúdo da documentação oficial do PHP, mas penso que é a que mais faz sentido. Afinal, do que adianta eu te mostrar as funções internas depois?

Tá, Kiko, e o que é uma função interna?

É uma função definida pré-declarada antes do interpretador começar a compilar sua aplicação. Lembra de Variáveis Pré-definidas? Assim como algumas variáveis já "chegam populadas", o interpretador também disponibiliza funções para facilitar nossas vidas.

Algumas delas possuem dependências externas, como extensões instaladas no PHP. Se você instalou o php-cli lá no começo, provavelmente não instalou a extensão php-mysql, que incorpora no PHP a possibilidade de se conectar a um banco MySQL usando as funções internas, como a mysqli_connect().

Interessante, Kiko, mas quais funções são disponibilizadas pra gente?

Que pergunta complicada, hein? São tantas funções que, sinceramente, é difícil mencionar qualquer uma delas, pois considero quase todas extremamente importantes. Por exemplo:

  • str_contains() (lê-se "string contains")
  • str_replace() (lê-se "string replace")
  • array_map()
  • array_filter()
  • array_merge()
  • array_get()
  • array_pop()
  • array_push()
  • array_fill()
  • array_flip()
  • array_intersect()
  • array_keys()
  • array_values()
  • etc.

Olha que eu só citei duas funções para lidar com string e onze para lidar com array. Tem funções para todo tipo de dado primitivo. Temos funções para construir manipuladores de data, enfim, tem de tudo! Acho que essa é uma parte que requer um pouco de autodidatismo na hora de explorar alguma ideia, sabe? Quando você sentir a necessidade de fazer uma determinada operação, pesquisa na documentação oficial se tem alguma função interna que já faz isso pra você, que tal?

E sempre dê preferência às funções internas, pois elas são nativas e provavelmente bem mais otimizadas do que qualquer solução que coloque na aplicação. No máximo, você pode acabar fazendo algo com uma semântica mais certa do que a função interna, porém isso pode acabar te custando desempenho... Pense bem, hein?

Ok, Kiko, como se usa uma função?

Todas as funções internas são nomeadas, isso significa que possuem uma assinatura para que você as invoque. Para chamar uma função, você coloca o nome dela seguido de parênteses. Por exemplo: nome(). Como mencionei na introdução, cada função pode ter argumentos de entrada e/ou algo a ser retornado. O argumento de entrada é passado dentro dos parênteses da chamada, por exemplo nome($argumento) e pode ser, inclusive, uma referência. Por isso, devemos ficar bem atentos sobre a assinatura das funções.

O que é isso, Kiko?

A assinatura é a definição de uma função. Ela diz:

  • o(s) argumento(s) esperado(s);
  • o(s) tipo(s) do(s) argumento(s);
  • se algum argumento é uma referência;
  • se algum argumento tem um valor padrão;
  • o(s) possível(eis) tipo(s) retornado(s).

Então, ao bater o olho na assinatura de uma função, você instantaneamente poderá saber se seus dados estão nos tipos esperados e se ele retorna alguma coisa. Fique atento aos casos de retorno void, pois não retornam nada. Se você atribuir o resultado de uma função dessa a uma variável, ela resultará em null.

Nem toda função tem o(s) tipo(s) declarado(s), afinal, PHP não é linguagem de tipagem forçada. Nesses casos, você vai sentir na pele a dificuldade que é depurar a função dos outros para entender suas limitações, hehehehe. Por isso, sempre defina bem a assinatura das suas funções quando aprender a escrevê-las, beleza?!

Repetindo: algumas funções retornam dados, outras não. Geralmente as que não retornam modificam as variáveis passadas no argumento via referência. Citando os exemplos da documentação, temos as funções str_replace e sort.

str_replace serve para substituir algum trecho de uma string por outra coisa, enquanto sort serve para ordenar um array. Eu sinto uma grande incoerência por trás de quem desenvolveu essas coisas, pois penso que a linguagem deveria escolher um comportamento padrão para todas as suas funções internas: ou atua na base do return, ou atua na base da referência.

De todo modo, o str_replace retorna o texto alterado, sem modificar a variável original. Assim, você não perde o dado original. Já o sort captura o array que você passar como uma referência e a modifica lá dentro dele, retornando apenas um bool indicando se conseguiu ordenar ou não, modificando o dado original...

Bem, se esse trecho foi mais difícil de visualizar, vamos colocar na prática:

<?php

$frasePolemica = 'Eu amo Javascript';
$fraseCorreta = str_replace('Javascript', 'PHP', $frasePolemica);

var_dump($fraseCorreta); // string(Eu amo PHP)

$array = [4, 3, 2, 7];
$resultado = sort($array);

var_dump($array); // array(2, 3, 4, 7)
var_dump($resultado); // bool(true)

Viu que a função sort alterou a variável $array? Pois é, é isso que é alterar por referência. Se ainda não faz ideia de como isso acontece, eu vou mostrar no próximo artigo, falando sobre funções definidas pelo usuário. No caso, nessa semântica, o usuário é o desenvolvedor, rs. Estranho, né?

E por hoje é só! Curtiu? Comenta e compartilha! Não sei se já vou conseguir voltar ao ritmo de mandar um artigo por dia útil, mas prometo me empenhar quando sobrar energias. De certeza, certeza mesmo, só depois desse mês, fechado?

Inté!!