Primeiras aulas do curso PHP: Programação Funcional

PHP: Programação Funcional

Revisitando funções - Apresentação

Boas vindas à Plataforma Alura! Sou o instrutor Vinícius Dias neste curso de Introdução a alguns conceitos da programação funcional utilizando a linguagem de programação PHP.

Programação funcional é um paradigma de programação que chamamos de declarativo, ou seja, ao invés de ficar falando para o computador tudo o que ele precisa fazer, só dizemos para ele o que queremos fazer e a partir disso ele toma as melhores decisões.

Nós vamos entender bastante os conceitos de como o PHP trabalha com funções, o que é uma função anônima, o que é essa tal de closure. A partir disso, vamos começar a entender o projeto onde vamos trabalhar.

Nós vamos manipular os dados de uma lista de países que possuem medalhas, sejam em Olimpíadas, em uma competição qualquer e, a partir disso, nós vamos realizar diversas transformações, filtros, manipulação nesses dados.

Essas manipulações vão utilizar alguns conceitos de programação funcional. Nós vamos ver como mapear dados, filtrar dados, reduzir dados a um único valor, nós vamos entender sobre aplicações parciais de funções, vamos compor funções, conhecer tipos monádicos, como esse, o Maybe.

Vamos praticar diversos conceitos da programação funcional, mas, obviamente, não tem como aprendermos um paradigma inteiro em um curso só. De novo, programação funcional é um paradigma de programação, ele vai te demandar um pouco mais de estudo, é uma nova forma de resolvermos problemas. Eu espero que esse treinamento seja um bom pontapé inicial para você.

Se durante o treinamento você ficar com qualquer dúvida não precisa hesitar, você pode abrir uma dúvida no fórum. Eu tento responder pessoalmente sempre que possível, mas quando eu não consigo, a nossa comunidade de alunos, moderadores e instrutores é muito solícita e com certeza alguém vai conseguir te ajudar.

Mais uma vez, boas vindas! Te espero no próximo vídeo para começarmos a dar uma olhada em como o PHP funciona com funções.

Revisitando funções - O tipo callable

Bem-vindos de volta. Antes de falarmos de programação funcional em si, desse novo paradigma que vamos começar a estudar, técnicas avançadas e etc, vamos começar do começo, vamos falar do básico, de PHP em si e como o PHP lida com funções de uma forma mais genérica, ainda sem pensar nesse novo paradigma que vamos estudar.

Para começar, um ponto muito importante que temos que entender é que o PHP lida com funções da mesma forma como ele lidaria com qualquer outro tipo de dados. Funções podem ser representadas como um tipo de dados.

O nome desse tipo é Callable ou invocável, chamável. Algo que podemos chamar, algo que podemos executar. Nós temos esse tipo de dados para representar algo que é executável.

Logo, se temos um tipo, podemos passar funções ou qualquer outra coisa que seja executável para parâmetros de outras funções, nós podemos retornar uma função dentro de outra função, podemos atribuir uma função a uma variável. Podemos tratar funções como um tipo de dados qualquer.

Esse é um ponto muito importante para darmos um bom pontapé inicial, para começarmos bem e entender conceitos mais lá na frente de programação funcional. Antes de qualquer coisa, antes de criarmos um projeto um pouco mais real, vamos brincar um pouco com esse conceito de atribuir uma função a uma variável, de passar uma função por parâmetro, de retornar uma função. Vamos brincar um pouco com isso para entendermos que o PHP lida com funções, como lida com qualquer outro tipo.

Vamos brincar aqui. No "PHP Storm", vou criar um novo arquivo. Vou abrir aqui o projeto. Eu tenho um projeto vazio, ele ainda não tem nada, só tem uma pasta src vazia, mas mesmo assim vou criar um arquivo aqui na raiz de brincadeira, porque só vamos brincar com esse arquivo, não vamos fazer nada muito interessante com ele.

Vou definir uma função chamada function qualquer, uma função qualquer que não recebe nenhum parâmetro e devolve uma string, function qualquer (): string. Essa função vai simplesmente retornar Olá mundo. return 'Ola mundo!'.

O que eu quero fazer? Eu quero passar essa função como parâmetro para outra função. Repare que o "PHP Storm" está me dando um erro aqui, porque ele não está configurado ainda. Pronto. Eu já disse que eu estou usando as versões mais novas do PHP.

Agora eu vou receber uma outra função. Antes de qualquer coisa, vamos executar essa função. qualquer(). Vou abrir o terminal e executar essa brincadeira. Vou receber nada porque eu não exibi essa mensagem. Um ponto interessante também que é bom frisar, já aprendemos antes, o retorno de uma função faz com que essa função tenha um valor.

Agora essa chamada aqui qualquer() vale a string "ola mundo". Preciso fazer alguma coisa com essa string, vamos exibir. Isso é revisão, só para ter certeza que está bem claro. Pronto. Tenho lá exibido o "ola mundo".

Agora o que quero fazer é mais do que isso, mais do que executar uma função, eu quero ter uma outra função, quero ter uma function outra que recebe um "Callable", que recebe uma outra função, function outro (callable funcao). O que eu vou fazer aqui? Isso não vai me retornar nada porque eu vou exibir algumas coisas aqui.

Eu sei que eu vou receber uma função, posso executá-la como eu quiser. Primeiro vou exibir uma mensagem: echo 'Executando outra função'. Aqui vou dar um espaço e exibir o que tiver nessa função.

Não vou passar nenhum parâmetro para ela. echo funcao(),. Repare como eu tenho aqui um parâmetro, que é função, uma variável qualquer, e estou executando essa variável, estou executando esse parâmetro porque eu sei que esse parâmetro é algo chamável.

Eu poderia vir aqui no final e executar esse outra(). Só que esse outra() precisa de uma função por parâmetro. Aqui começa a coisa interessante acontecer. Como que eu passo uma função para outra, como que eu represento uma função como parâmetro?

Aqui existem várias formas. Se eu digitar somente o nome da função, eu não consigo, não funciona. Eu não tenho esse identificador aqui. Repare que o "PHP Storm" já está me dando erro dizendo que eu não tenho essa constante qualquer. outra( funcao: qualquer).

Se eu executar essa função, o que eu vou estar passando para cá é o retorno da função qualquer, que é uma string, isso também não vai dar certo porque essa string "ola mundo" não quer dizer nada. O que eu quero passar é o nome da função que eu vou executar.

Repare que o "PHP Storm" não me deu erro porque passar uma string como callable é um tipo válido. Só que a string que eu passar aqui precisa ser o nome de uma função válida, como por exemplo, qualquer. outra ('qualquer').

Com isso, o PHP vai passar qualquer aqui como função e essa função qualquer vai ser avaliada e executada. Vou abrir o terminal de novo, se eu executo essa brincadeira, eu devo ver executando uma outra função dois pontos, espaço "olá mundo". executando uma outra função: ola mundo. Se tudo der certo, tem o resultado esperado.

Uma outra forma muito comum de passar funções por parâmetro é através de funções anônimas. Uma função anônima é exatamente isso que o nome diz, uma função que é anônima, que não tem nome, que não precisa ser identificada.

Como eu poderia fazer isso? Vou remover isso daqui e agora vou criar diretamente aqui uma função outra(function () ). Qual o nome dela? Não tem, é uma função anônima por isso não coloco nenhum nome. Tenho aqui a lista de parâmetros e tenho o corpo, a execução dessa função. outra(function () {}.

Aqui posso retornar uma outra função, por exemplo. return 'Uma outra função'. Agora o que estou fazendo? Essa função aqui está sendo criada sem nome e sendo atribuída a esse parâmetro função, logo eu posso executar sem problema. Vamos de novo executar php brincadeira e eu tenho que ver executando outra função: 'Uma outra função'.

Vamos lá. Funciona sem problemas. Só para finalizarmos, para encerrarmos, eu posso atribuir isso aqui a uma variável, por exemplo, $nomeDaFuncao = function ();. Pronto, tenho uma variável que contém uma função. Repara que como isso aqui é uma expressão, é algo que vai ser retornado, é uma instrução completa do PHP, eu preciso do ponto e vírgula aqui.

Tudo que representa um valor é avaliado como uma expressão precisa de ponto e vírgula no final. Definições, como definições de classe, funções e etc, não precisam de ponto e vírgula no final. Repara que que depois das chaves, eu não tenho o ponto e vírgula, mas aqui eu tenho porque isso é uma expressão.

Esses detalhes vão ficar muito mais claros conforme praticamos, mas, basicamente, uma função pode ser passada por parâmetro, pode ser retornada como um tipo normal, pode ser armazenada a uma variável, eu posso ter funções anônimas, ou seja, uma função que não tem nome. Conforme vamos passando e vamos avançando nesse treinamento, vamos entender muito melhor os usos para esse tipo de técnica.

Só que antes de começarmos a utilizar é muito importante entender esse básico. Muito provavelmente, se você já estudou, se você já pesquisou sobre funções em PHP, você se deparou com a palavra closure.

No próximo vídeo vamos falar um pouco sobre essa palavra, o que ela é, como ela é no PHP e vamos entender um pouco melhor para, só depois de entender esses conceitos mais básicos, começarmos a botar a mão na massa e criar algum projeto.

Revisitando funções - Closures

Bem-vindos de volta. No último vídeo já entendemos o conceito de funções e callbacks é um nome para uma função que passamos por parâmetro, por exemplo. Já entendemos que funções podem ser utilizadas como um tipo qualquer. Vimos um detalhe interessante que são as funções anônimas, funções que não tem nenhum nome.

Agora, um nome, um termo que sempre é muito falado, mas talvez fique um pouco confuso é esse aqui, Closure. Primeiro vamos entender o que é uma Closure no PHP e depois eu vou falar um pouco de um conceito. Basicamente Closure no PHP é uma classe e essa classe é utilizada para representar uma função anônima.

Sempre que criamos uma função anônima, quando criamos uma função no PHP e não dá um nome para ela, o que acontece é que o PHP por baixo dos panos gera um objeto desse tipo aqui. Se viermos naquele código da última aula e fizer um var_dump ($nomeDaFuncao). O nome da função tem uma função aqui. Foi um péssimo nome de variável que eu dei, mas, basicamente, a variável nome da função contém a função.

Segundo a documentação, isso aqui deveria ser um objeto do tipo Closure. Quando eu executo o brincadeira eu tenho: Executando outra função, e depois nosso var_dunp mostra que nós temos um objeto do tipo Closure.

Closure é uma classe do PHP, onde todas as nossas funções anônimas geram um objeto do tipo Closure. Isso aqui é como o PHP funciona. A partir desse nome da função, nós podemos chamar alguns métodos, como por exemplo o método bindTo, ou seja, a partir desse método eu posso fazer uma ligação com algum objeto que já existe.

Esse objeto vai tratar essa função como se fosse um método dele. Isso é bem interessante, mas foge um pouco do escopo, você pode brincar um pouco com esse método, é bem legal.

Entendido que funções anônimas geram objetos do tipo Closure no PHP, vamos entender um pouco mais sobre essa palavra, Closure. Quando estamos falando de conceitos de programação e não do PHP em específico, Closure é uma função, só que é uma função que tem acesso ao escopo externo.

"Vinícius, agora complicou tudo, nada mais fez sentido." Vamos com calma, deixa eu te explicar um detalhe bastante importante. Eu tenho aqui a função outra e eu tenho aqui uma variável variável, um ótimo nome. $variavel. Essa variável vai ter o valor teste. $variavel = teste ;.

Se eu venho aqui na minha função outra e tento exibir variável, repara que o "PHP Storm" já me diz que não posso fazer isso, o que faz todo sentido. Uma função, já que é uma função realmente, ela tem um nome, é uma estrutura, é um procedimento do meu programa, não deveria acessar variáveis do escopo externo.

Só que normalmente quando estamos criando uma função anônima, queremos realizar algum trabalho, queremos realizar alguma tarefa e essas tarefas são pontuais, não é um procedimento que vai ser reaproveitado, é algo pontual, normalmente esses procedimentos precisam acessar o escopo externo.

Ao invés de utilizar a péssima prática de variáveis globais, o que conseguimos fazer? Eu consigo, por exemplo, exibir aqui variáveis? Também não. Só que eu posso dizer: "PHP, eu quero explicitamente, estou te informando que eu preciso usar essa variável aqui. Eu preciso usá-la para minha rotina".

Posso vir aqui utilizando o PHP e falar para ele: "eu quero usar a variável". $nomeDaFuncao - function () use ($variavel). Com isso, essa Closure aqui, essa função vai receber a variável variável do escopo fora dessa função, ou seja, vai pegar esse valor de fora e conseguir utilizar aqui dentro.

Isso aqui além de ser uma Closure no PHP, está mais próximo ao conceito de Closure, um conceito realmente de programação. Uma função que acessa, que herda um escopo externo, que recebe valor do escopo externo sem ser por parâmetro, claro, como fizemos aqui, é uma Closure, ou seja, Closures, no sentido conceitual, são funções, funções que recebem o escopo externo, que tem acesso ao escopo externo.

Agora no PHP, a classe Closure representa qualquer função anônima, tendo ela acesso ao escopo externo ou não.

Com isso, começamos a entender alguns conceitos e tendo os conceitos definidos, vamos finalmente começar a botar a mão na massa. Vamos pegar um projeto e trabalhar em cima dele. No próximo vídeo, eu volto mostrando no que vamos trabalhar durante esse treinamento.

Sobre o curso PHP: Programação Funcional

O curso PHP: Programação Funcional possui 107 minutos de vídeos, em um total de 50 atividades. Gostou? Conheça nossos outros cursos de PHP em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda PHP acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas