Alura > Cursos de Programação > Cursos de PHP > Conteúdos de PHP > Primeiras aulas do curso PHP: evolua seu conhecimento e organize seu código

PHP: evolua seu conhecimento e organize seu código

Evoluindo o ScreenMatch - Apresentação

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).

Pré-requisitos

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ê.

O que vamos aprender?

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!

Evoluindo o ScreenMatch - Separando o código

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.

Execução e Análise de Resultados

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.

Analisando 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

Entendendo a Criação e Utilização de Funções

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.

Conclusão e Próximos Passos

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!

Evoluindo o ScreenMatch - Funções e retorno

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.

Contextualizando o problema

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.

Criando a função 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.

Mapeando os 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.

Utilizando a palavra reservada 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

Conclusão e Próximos Passos

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!

Sobre o curso PHP: evolua seu conhecimento e organize seu código

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:

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

Conheça os Planos para Empresas