Boas-vindas à Alura!
Me chamo Vinícius Dias e irei guiar você neste curso de PHP, em que continuaremos o nosso aprendizado. Antes de explicar o que vamos aprender, por motivos de acessibilidade, vou me autodescrever.
Audiodescrição: Vinícius é um homem branco, de cabelo curto e escuro. Possui bigode e cavanhaque. Veste uma camiseta escura, com detalhes escrito PHP Community Summit (Cúpula da Comunidade PHP).
Se você concluiu o curso introdutório "Aprendendo a criar sua primeira aplicação com PHP", ou seja, se possui um conhecimento básico da sintaxe do PHP incluindo if()
, loop()
, então este curso é adequado para você.
Durante este curso, vamos expandir a partir desse conhecimento inicial, usando como base a construção do ScreenMatch, nossa plataforma de streaming de filmes. Abordaremos aspectos mais detalhados da linguagem PHP, bem como conceitos de programação, organização de código, entre outros tópicos.
Começaremos entendendo como dividir partes de nossos códigos e dando-lhes nomes, e veremos que essa estrutura é chamada de funções. Em seguida, aprenderemos também como dividir nosso código em arquivos diferentes, para evitar que um único arquivo contenha todo o código. Entenderemos melhor como manipular arquivos com PHP, explorando formatos de dados e aprendendo a ler e escrever em arquivos externos usando PHP.
Por exemplo, poderemos exportar um filme e importar um filme previamente salvo no arquivo. Ao lidar com essas tarefas, abordaremos novamente a organização do código, dividindo nosso projeto em pastas e discutindo como interpretar os erros que o PHP pode mostrar. No final, teremos uma breve introdução sobre como o PHP opera na web.
Vamos ter um formulário na web, enviando dados que o PHP vai processar, fazer um redirecionamento da pessoa usuária, exibir uma mensagem de sucesso no final. Vamos sair desse curso conseguindo entender como o PHP pode ser utilizado na web.
Se surgirem dúvidas durante o processo ou se algo não ficar claro, não hesite em buscar ajuda. Você pode abrir um tópico em nosso fórum ou iniciar uma discussão em nosso servidor do Discord. Certamente, alguém estará disponível para auxiliá-lo, e essa troca de informações é muito proveitosa. Além disso, convidamos você a participar respondendo perguntas e participando de discussões de outras pessoas, pois isso ajuda na fixação do conteúdo.
Novamente, boas-vindas, e aguardamos você no próximo vídeo para começarmos a trabalhar e organizar nosso código PHP juntos!
Olá, pessoal! Boas-vindas de volta.
Vamos revisitar o screen-match.php
, nossa aplicação existente desenvolvida no curso anterior, que trata principalmente de filmes. Essencialmente, é o nosso sistema de streaming de filmes e séries. Concluímos o desenvolvimento desse código. Se você não participou do primeiro curso, pode fazer o download desse projeto agora.
Com o código aberto no Visual Studio Code, abrimos um terminal com "Ctrl + Crase", ou em "Terminal > New Terminal" na parte superior. Para limpar a tela, usamos "cls
" para Windows ou "clear
" para Linux e Mac. Rodamos o comando php screen-match.php
e passamos uma quantidade de notas. Por exemplo, nota 10, nota 7, nota 8.5, nota 5 e nota 9.3.
php screen-match.php 10 7 8.5 5 9.3
Com isso, ao pressionarmos "Enter", temos a média de nota e todas as informações do filme sendo exibidas.
Bem-vindo(a) ao screen match! Nome do filme: Top Gun - Maverick Nota do filme: 7.96 Ano de lançamento: 2022 Esse filme ainda é novo O gênero do filme é: ação 2021
Vamos analisar o código.
Estamos lidando com a quantidade de notas, armazenando-as, somando-as, fazendo a média, dividindo pela quantidade de notas. Estamos fazendo uma verificação se esse filme está ou não incluído no plano (linha 19), e isso leva em consideração se a pessoa está no plano Prime ou se o ano de lançamento é anterior a 2020. Exibimos os detalhes do filme no echo
.
Verificamos para exibir uma mensagem se esse filme é lançamento, se ele ainda é novo ou já não é mais um lançamento. Depois pegamos o gênero e tudo mais e no final exibimos o ano desse filme que trabalhamos com o Array.
Imagine num cenário real. Desejamos exibir essa mensagem para a pessoa usuária informando se o filme é um lançamento, se ele ainda é novo, mas não é mais um lançamento ou se já não é mais novo.
Queremos exibir essa mensagem no catálogo de filmes, na página de detalhes desse filme, se estivermos compartilhando esse filme com uma pessoa. Existem alguns momentos onde desejamos exibir essa imagem, onde queremos executar essa mesma ação.
Imagine uma situação mais realista. Seria necessário replicar esse código e inseri-lo na página do catálogo, em seguida, inseri-lo novamente na página de visualização detalhada do filme. Isso resultaria na duplicação do código em diferentes partes. Essa duplicidade representa um desafio em termos de manutenção do código.
No passado, quando tínhamos apenas uma pessoa trabalhando no projeto e lidávamos com projetos de pequena escala, isso não representava um grande problema. Isso se deve ao fato de que, com apenas uma pessoa, é mais fácil lembrar que determinada mensagem também deve estar em outra página, por exemplo.
No entanto, à medida que nos profissionalizamos e começamos a trabalhar em equipes e em projetos de maior porte, é muito mais fácil perder um ponto de alteração. Além disso, ao facilitar a manutenção do código, também podemos torná-lo mais legível e compreensível.
screen-match.php
// código omitido
if ($anoLancamento > 2022) {
echo "Esse filme é um lançamento\n";
} elseif ($anoLancamento > 2020 && $anoLancamento <= 2022) {
echo "Esse filme ainda é novo\n";
} else {
echo "Esse filme não é um lançamento\n";
}
// código omitido
Qual é o nosso objetivo? Pretendemos identificar e nomear o trecho de código mencionado acima, responsável por exibir a mensagem de lançamento. Durante a execução principal do nosso arquivo screen-match.php
, há uma sequência de operações em andamento.
Chamaremos essa sequência de operações de screen-match
, o nome do nosso arquivo. Além disso, queremos atribuir um nome específico a esse trecho dentro da sequência de operações, muitas vezes referido como sub-rotina por algumas pessoas.
Para realizar isso, vamos utilizar a combinação de teclas "Ctrl + X" para recortar o trecho selecionado. Alternativamente, podemos clicar com o botão direito e escolher a opção "Cut" ou Recortar, o que efetivamente copiará e removerá o trecho do código.
Nesse trecho de código, ao invés de ter todo aquele código e em todos os outros lugares onde teríamos a exibição dessa mensagem, ao invés de ter todo aquele código, queremos ter algo como exibeMensagemLancamento
.
Desejamos informar que queremos exibir a mensagem de lançamento nesse trecho de código. Em outro lugar, em outro arquivo, em outra tela, podemos exibir a mesma mensagem. Vamos ter um trecho de código com esse nome aqui.
Precisamos criar um trecho de código com esse nome antes de executar. No início do arquivo, antes do "Bem-vindo(a) ao screen match!", criamos o exibeMensagemLancamento
e depois criamos um bloco e colamos aquele código que recortamos.
Aprendemos no cenário do if()
, dos nossos loops, que quando temos um bloco de códigos, colocamos esse bloco entre chaves. Abrimos e fechamos as chaves após o exibeMensagemLancamento
.
Teclamos "Enter", então temos exibeMensagemLancamento
, abrimos chaves, temos espaço vazio, depois fechamos as chaves. Nesse espaço vazio, colamos o trecho de código recortado.
screen-match.php
<?php
exibeMensagemLancamento {
if ($anoLancamento > 2022) {
echo "Esse filme é um lançamento\n";
} elseif ($anoLancamento > 2020 && $anoLancamento <= 2022) {
echo "Esse filme ainda é novo\n";
} else {
echo "Esse filme não é um lançamento\n";
}
}
// código omitido
Se o ano de lançamento for maior do que 2022, exibimos que é um lançamento. Se for entre 2020 e 2022, ainda é novo. Caso contrário, se for 2020 ou antes, ele não é mais um lançamento. Só que tem alguns problemas nesse código.
Se salvarmos esse código, como o Visual Studio Code está configurado aqui com PHP, ele deve nos avisar que existem problemas. O primeiro problema é: ano de lançamento não existe nesse bloco de código.
Estamos definindo um nome para esse exibeMensagemLancamento
, um nome para esse bloco, e podemos informar também que ele espera, para quem for chamar esse trecho de código, ele espera algum parâmetro, ele espera informações.
As informações referidas como parâmetros ou argumentos são colocadas entre parênteses. Por exemplo, ao chamar a função exibeMensagemLancamento()
, é necessário fornecer o ano de lançamento, que chamamos de $anoLancamento
.
screen-match.php
<?php
exibeMensagemLancamento($anoLancamento) {
if ($anoLancamento > 2022) {
echo "Esse filme é um lançamento\n";
} elseif ($anoLancamento > 2020 && $anoLancamento <= 2022) {
echo "Esse filme ainda é novo\n";
} else {
echo "Esse filme não é um lançamento\n";
}
}
// código omitido
É importante notar que o nome anoLancamento
usado como parâmetro não precisa ser idêntico ao nome da variável definida em outro local.
São coisas distintas; a variável anoLancamento dentro da função exibeMensagemLancamento()
não se confunde com aquela definida fora dessa rotina.
Inclusive, para isso ficar mais claro, vamos trocar anoLancamento
para somente ano
. Tanto aqui no parâmetro, quanto em todos os lugares que usamos esse parâmetro, essa variável.
screen-match.php
<?php
exibeMensagemLancamento($ano) {
if ($ano > 2022) {
echo "Esse filme é um lançamento\n";
} elseif ($ano > 2020 && $ano <= 2022) {
echo "Esse filme ainda é novo\n";
} else {
echo "Esse filme não é um lançamento\n";
}
}
// código omitido
Agora, o nosso código vai ficar com ano
maior do que em 2022. Se for, exibe mensagem. Se não, ano
maior do que 2020 e menor ou igual a 2022. Se for, exibe que ainda é novo. Caso contrário, não é mais um lançamento. Só que ainda tem um erro acontecendo, observe que há um sublinhado na cor vermelha em if ($ano > 2022)
.
Por quê? Esse exibeMensagemLancamento()
, sem nenhuma informação do que é isso, não existe no PHP.
O PHP, assim como praticamente todas as linguagens de programação, possui um termo chamado palavras reservadas. Que são palavras que indicam algum significado especial naquele trecho de código. Por exemplo, o if()
, que é uma palavra reservada do PHP.
Nesse trecho de código, o termo if()
adquire um significado específico, indicando ao PHP que estamos criando uma estrutura de tomada de decisão. A palavra reservada para informar que estamos criando um bloco de código, que vai ser chamado em outros lugares, é function
. Então antes de exibeMensagemLancamento()
, precisamos escrever function
.
screen-match.php
<?php
function exibeMensagemLancamento($ano) {
if ($ano > 2022) {
echo "Esse filme é um lançamento\n";
} elseif ($ano > 2020 && $ano <= 2022) {
echo "Esse filme ainda é novo\n";
} else {
echo "Esse filme não é um lançamento\n";
}
}
// código omitido
O que estamos fazendo neste ponto? Então essa sub-rotina também tem o nome de função. Estamos criando uma função chamada exibeMensagemLancamento()
.
Já utilizamos funções no curso anterior. Por exemplo, a função array_sum()
. Que é uma função que recebe um array por parâmetro e faz a soma dele. Então essa nossa função exibeMensagemLancamento()
, recebe por parâmetro um ano
. E esse ano vamos trabalhar e exibir a mensagem.
Descemos o código até onde vamos chamar essa função. Repare que tem erro acontecendo.
screen-match.php
// código omitido
exibeMensagemLancamento
$genero = match ($nomeFilme) {
"Top Gun - Maverick" => "ação",
"Thor: Ragnarok" => "super-herói",
"Se beber não case" => "comédia",
};
// código omitido
Primeiro, falta o ponto e vírgula. Logo depois desse exibeMensagemLancamento
. Observe que o sublinhado na cor vermelha já sumiu na linha seguinte. E segundo, sempre que estamos chamando uma função, precisamos informar os parênteses.
screen-match.php
// código omitido
exibeMensagemLancamento();
$genero = match ($nomeFilme) {
"Top Gun - Maverick" => "ação",
"Thor: Ragnarok" => "super-herói",
"Se beber não case" => "comédia",
};
// código omitido
Mesmo que a função não espere nenhum parâmetro, o que é uma possibilidade, ainda assim, ao chamar essa função, devemos incluir os parênteses vazios tanto na definição quanto na execução dela.
Na chamada, precisamos especificar o parâmetro, que no nosso caso é a variável anoLancamento
.
screen-match.php
// código omitido
exibeMensagemLancamento($anoLancamento);
// código omitido
Observe que estamos passando o valor da variável anoLancamento
como um parâmetro. Esse valor será recebido dentro da função pelo parâmetro chamado ano
. Portanto, dentro dessa função, não encontramos a variável anoLancamento
, mas sim o parâmetro ano
, que também é uma variável.
Dessa forma, com essa organização, temos uma leitura mais interessante do código. E se essa mensagem fosse exibida em vários lugares, precisaríamos alterar em um ponto só. Porque nos outros lugares só estamos chamando a função.
Executaremos nosso código, abriremos o terminal novamente, executaremos com os mesmos parâmetros e veremos se o resultado é o mesmo.
php screen-match.php 10 7 8.5 5 9.3
Obtemos como retorno:
Bem-vindo(a) ao screen match! Nome do filme: Top Gun - Maverick Nota do filme: 7.96 Ano de lançamento: 2022 Esse filme ainda é novo O gênero do filme é: ação 2021
E, de fato, o resultado é o mesmo. A mensagem exibida indica que o filme ainda é novo. Se nos deslocarmos para o final do arquivo e chamarmos essa função novamente passando agora um outro ano qualquer, por exemplo, 1990 por parâmetro.
screen-match.php
// código omitido
echo $filme["ano"];
exibeMensagemLancamento(1990);
Ao salvarmos as alterações, abrimos nosso terminal e executamos o código de novo, lá embaixo está escrito "esse filme não é um lançamento".
Esse filme não é um lançamento
Então repare que podemos ter esse pedaço de código sendo executado em vários lugares. Isso ajuda muito na separação e organização do nosso código.
Vamos remover essa chamada no final, porque ela não faz sentido. E agora tem um detalhe. Repare que no nosso array_sum()
, a função que o PHP já define e entrega para nós, estamos usando o valor dessa função dentro de uma variável notaFilme
. Só que a exibeMensagemLancamento
, não.
screen-match.php
// código omitido
$notaFilme = array_sum($notas) / $quantidade DeNotas;
$planoPrime = true;
// código omitido
Só estamos chamando ela sem atribuir a nada. Ela não tem nenhum valor.
Como podemos fazer para que uma função nossa seja atribuível, ou seja, possa ser utilizada em uma expressão, por exemplo, que possamos atribuir o valor de uma variável, que essa função representa. Vamos entender esse conceito de retorno de funções no próximo vídeo!
Olá, pessoal! No vídeo anterior, conhecemos a ideia de funções e criamos a nossa própria função. Aprendemos que já utilizamos funções no curso anterior e vamos nos aprofundar um pouco mais nesse assunto agora.
Imaginem o seguinte cenário: o trecho de código que diz $incluidoNoPlano
, também precisa ser utilizado em vários lugares da nossa aplicação.
screen-match.php
// código omitido
$incluidoNoPlano = $planoPrime || $anoLancamento < 2020;
// código omitido
Por exemplo, na hora de exibir o catálogo, verificamos se cada filme está incluído no plano da pessoa para não exibir esse filme se não estiver incluído.
Nos detalhes também desse filme, queremos adicionar essa verificação para garantir que ninguém burlou essa verificação no catálogo e conseguiu chegar à página do filme do "incluído no plano". Podemos também, em uma página promocional, verificar se aquele filme faz parte do plano da pessoa para exibir a promoção ou não.
Em vários lugares, encontraremos esse trecho de código para verificar se o filme está incluído no plano da pessoa ou não. Um ponto importante a ser observado é que esse tipo de regra está sujeito a alterações constantes. Por exemplo, a definição de um filme recente pode deixar de ser até 4 anos e passar a ser apenas 3, 2 ou 5 anos.
Portanto, essa é uma regra que pode ser modificada com frequência. Da mesma forma, a classificação como plano prime ou não também pode ser alterada com frequência.
Desejamos que esse trecho de código também esteja em uma função. Neste ponto, tem um detalhe muito importante: não exibimos nada, não é uma função que podemos chamar e ela faz tudo sozinha. Precisamos pegar de volta um valor dela, que, nesse caso, é o resultado da expressão $planoPrime || $anoLancamento < 2020
, se é plano prime ou se o ano de lançamento é menor do que 2020.
incluidoNoPlano()
Vamos criar essa função novamente no topo do arquivo. Logo após o final da função exibirMensagemDeLancamento()
, na linha 11, quebramos a linha e criamos uma nova função. Assim, escrevemos function
, espaço, incluidoNoPlano()
. Aqui, entre parênteses, identificamos os parâmetros necessários. Então, abrimos as chaves.
screen-match.php
// código omitido
function incluidoNoPlano() {
}
// código omitido
Atualmente, nossa função está vazia, sem corpo ou código e sem parâmetros. Então, na variável incluidoNoPlano
, copiaremos o valor de planoPrime
até 2020
, o colaremos dentro de nossa função incluidoNoPlano
e adicionaremos um ponto e vírgula ao final.
screen-match.php
// código omitido
function incluidoNoPlano() {
$planoPrime || $anoLancamento < 2020;
}
// código omitido
Ao salvarmos, sabemos que temos alguns problemas.
Inicialmente, a variável planoPrime
não está definida. Além disso, a variável anoLancamento
também não está definida nesta função. Portanto, precisamos receber esses dois parâmetros.
O primeiro será planoPrime
, e o segundo será anoLancamento
. Ao lidar com vários parâmetros, é necessário separá-los por vírgulas. Portanto, vamos receber o parâmetro anoLancamento
dentro do parênteses.
screen-match.php
// código omitido
function incluidoNoPlano($planoPrime, $anoLancamento) {
$planoPrime || $anoLancamento < 2020;
}
// código omitido
Agora, o que acontece? Temos essa verificação se é planoPrime
ou se o anoLancamento
é menor do que 2020
. Só que o que acontece também, se viermos na nossa variável incluidoNoPlano
na linha 33 e simplesmente trocarmos toda essa expressão por incluidoNoPlano
. Ou seja, pela chamada da função, e passarmos todos os parâmetros, por exemplo, planoPrime
e o anoLancamento
.
screen-match.php
// código omitido
$incluidoNoPlano = incluidoNoPlano($planoPrime, $anoLancamento);
// código omitido
O que ocorre exatamente? Como a função incluidoNoPlano
determina que, ao final de sua execução, deve representar aquela expressão? Como a variável incluidoNoPlano
sabe que seu valor deve ser o resultado calculado pela função incluidoNoPlano
em última análise?
Dentro da função, é necessário especificar que, após a execução de todas as operações, o valor a ser retornado é esse, ou seja, este é o resultado que a função devolve para quem a chamou. Para isso, empregamos a palavra reservada return
.
return
Então, antes dessa expressão, antes de verificarmos se planoPrime
é verdadeiro ou se anoLancamento
é menor ou igual a 2020, vamos inserir a palavra return
seguida de um espaço.
screen-match.php
// código omitido
function incluidoNoPlano($planoPrime, $anoLancamento) {
return $planoPrime || $anoLancamento < 2020;
}
// código omitido
O que esse return
indica? Ele indica que a expressão imediatamente após ele, ou seja, a expressão nesta linha, será o valor retornado pela função após sua execução.
Essa função recebe como parâmetros o planoPrime
e o anoLancamento
. Ela verifica se o planoPrime
é verdadeiro ou se o anoLancamento
é menor que 2020. Após essa verificação, o resultado é avaliado como verdadeiro ou falso, e o return
devolve esse resultado para quem chamou a função.
Na hora de executar toda essa chamada da função incluidoNoPlano()
, passa a valer o que ela retornou, que pode ser true (verdadeiro) ou false (falso), dependendo dos parâmetros que passarmos. Isso é uma função que possui retorno.
Na prática (código) não tem diferença nenhuma. Mas o conceito de uma sub-rotina para uma função. Uma função possui retorno, uma subrotina não. No caso do PHP, toda função retorna alguma coisa, mas isso é um detalhe que podemos abordar posteriormente.
Mas na prática, não tem nenhuma diferença na hora de definir a função. Só que temos o return
quando vamos retornar alguma coisa. Com isso, conseguimos ter a nossa verificação se o plano está incluidoNoPlano
ou se o filme está incluidoNoPlano
ou não, que pode ser modificada no futuro em um único lugar, e isso vai se replicar em todas as telas que utilizarmos.
Se abrirmos o terminal e executarmos o código, temos exatamente o mesmo resultado.
Bem-vindo(a) ao screen match! Nome do filme: Top Gun - Maverick Nota do filme: 7.96 Ano de lançamento: 2022 Esse filme ainda é novo O gênero do filme é: ação 2021
No código, temos a variável incluidoNoPlano
com o seu valor correto.
screen-match.php
// código omitido
$incluidoNoPlano = incluidoNoPlano($planoPrime, $anoLancamento);
// código omitido
Até este ponto, abordamos o conceito de funções e discutimos como realizar retornos. Agora, gostaríamos de destacar um último ponto importante relacionado aos tipos.
Entenderemos como podemos tornar nossa função mais confiável ao especificar os tipos de dados tanto para os parâmetros quanto para o retorno. Fique atento para o próximo vídeo, onde discutiremos mais sobre tipos!
O curso PHP: evolua seu conhecimento e organize seu código possui 104 minutos de vídeos, em um total de 53 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:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.