Bora ajudar o programador a transformar café em código?

Mostrando postagens com marcador Função. Mostrar todas as postagens
Mostrando postagens com marcador Função. Mostrar todas as postagens

A Classe DateTime - Trabalhando com Datas e Times com Orientação a Objetos

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial, vamos aprender como trabalhar com datas e tempo através da programação orientada a objetos em PHP.

Estudar pela apostila de PHP


Curso de PHP com certificado
Obter meu certificado!

Criando objetos da classe DateTime

A classe DataTime provém uma série de métodos, atributos e possibilidades que nos permitem trabalhar de maneira muito mais fácil com datas e tempo, usando orientação a objetos.

Vamos criar um objeto desta classe:
$date = new DateTime();

Se dermos um print_c($date);, veremos que no resultado é o atual, do momento da criação do objeto:
DateTime Object (
[date] => 2019-02-28 11:06:53.684238
[timezone_type] => 3
[timezone] => America/Sao_Paulo )

É um objeto do momento atual, no momento que estou programando este tutorial.

Construtor da classe DateTime

Podemos, porém, já inicializar com uma data, no formato: ano-mes-dia, para criar um objeto com uma data específica.

Vamos escolher uma data aleatória:
$date = new DateTime("2020-02-28");

O resultado da print_r($date); é:
DateTime Object (
[date] => 2019-02-28 00:00:00.000000
[timezone_type] => 3
[timezone] => America/Sao_Paulo )

Formatando datas e horas: Método format()

A classe DateTime possui o método format() que usa os mesmos parâmetros da função date(), assim podemo exibir o formato de data e hora do jeito que quisermos.

Por exemplo, para exibirmos no formato brasileiro de: dd/mm/YYYY Hora:minuto:segundo, basta fazer:
$date = new DateTime();
echo $date->format( "d/m/Y H:i:s" );

Somando e Subtraindo datas

Que tal saber qual foi a data de 35 dias atrás?
Basta fazer:

$date = new DateTime('-35 days');
echo $date->format( "d/m/Y H:i:s" );

E qual data vai ser daqui 2 semanas e 10 dias?
$date = new DateTime('+2 weeks 10 days');
echo $date->format( "d/m/Y H:i:s" );

Diferença entre datas: Método diff()

Imagina calcular, de maneira instantânea a diferença de anos, meses, dias, horas, minutos e até segundos daqui até uma outra data?

Vamos pegar a data atual:
$hoje = new DateTime();

Agora uma futura qualquer:
$futuro = new DateTime('2020-02-27');

O array $diff vai armazenar a diferença entre $futuro e $hoje, assim:
$diff = $hoje->diff($futuro);

Para exibir o resultado, faça:
 <?php
  $hoje = new DateTime();
  $futuro = new DateTime('2020-02-27');
  
  $diff = $hoje->diff($futuro);
  
  echo "Diferença de: <br/>"
    .$diff->days . " dias <br/>"
    .$diff->m . " meses <br/>"
    .$diff->y . " anos <br/>"
    .$diff->h . " horas <br/>"
    .$diff->i . " minutos <br/>"
    .$diff->s . " segundos<br/>";
 ?>
O resultado aqui foi:
Diferença de:
363 dias
11 meses
0 anos
12 horas
28 minutos
28 segundos

Bem preciso esse PHP, não ?

Modificando Data e Hora: setDate() e setTime()

Após criar e definir seu objeto do tipo DateTime, é totalmente possível mudar seus atributos, como ano, dia, hora ou o que for, através dos setters.

Vamos definir a data atual e exibir ela:
$data = new DateTime();
echo $data->format( "d/m/Y H:i" )."<br />";

O resultado é: 28/02/2019 11:37 (sim, tá quase na hora do almoço)

Agora vamos mudar a data pra 01/03/2019, amanhã e o horário para 12:00.
Nosso código fica assim:
$data->setDate(2019,03,01);
$data->setTime(12,0,0);
echo $data->format( "d/m/Y H:i" )."<br />";

E o resultado assim: 01/03/2019 12:00

Bonitinho, não?

Comparando Datas: var_dump

Muitas vezes é preciso saber se uma data é igual a outra, se é anterior, posterior...
Vamos criar uma variável que representa hoje e outra amanhã:
  $hoje = new DateTime();
  $amanha = new DateTime('2019-03-01');

Vamos comparar se elas são iguais:
  var_dump($hoje == $amanha);

O resultado vai ser: bool(false)

Agora vamos comparar se amanhã é maior que hoje:
  var_dump($amanha > $hoje);

O resultado vai ser: bool(true)

Que bom que deu verdade, né?


É possível ainda trabalhar com fuso-horário, somar intervalos de tempo, subtrair, definir língua e local que vai usar e uma porção de outros métodos para você usar, para aprender mais, acesse a documentação oficial do PHP:

http://php.net/manual/pt_BR/class.datetime.php

Calculando Datas no Futuro e no Passado: strtotime()

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Muitas vezes, é necessário que saibamos a data exata para daqui algum tempo.

Por exemplo, qual a data daqui 40 dias?
Que data foi 20 dias atrás?

Obviamente, não vamos ficar fazendo contas nas mãos.
Para isso, temos a função strotime()

Calculando datas no futuro: strotime

Ela é uma função nativa do GNU Linux e possui uma sintaxe bem simples e acessível.
Para exibir uma data daqui 40 dias:
<?php
 $futuro = strtotime("40 days");
 echo date("d/F/Y", $futuro);
?>

Para calcular daqui 3 semanas:
<?php
 $futuro = strtotime("3 weeks");
 echo date("d/F/Y", $futuro);
?>

2 semanas e 4 dias:
<?php
 $futuro = strtotime("2 weeks 4 days");
 echo date("d/F/Y", $futuro);
?>

Calculando datas no passado: strotime

A sintaxe é a mesma, mas vamos usar valores negativos na função strotime().
Para saber que dia foi 20 dias atrás:
<?php
 $passado = strtotime("-20 days");
 echo date("d/F/Y", $futuro);
?>

Uma semana atrás:
<?php
 $passado = strtotime("-1 week");
 echo date("d/F/Y", $passado);
?>
a

Última Modificação de uma Página: getlastmod()

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Quase sempre, é muito importante saber qual foi a última vez que uma página foi modificada pela última vez.

Imagine que você tenha um site de promoções e vendas, é essencial exibir a data e o horário nele, pois os usuários precisam saber se ele está sendo atualizado, se as informações estão 'fresquinhas'.

Última Alteração da Página: Função getlastmod()

O PHP possui uma função pré-definida muito útil, que exibe a última alteração de uma página, é a getlastmod().

Teste:
<?php
 echo getlastmod();
?>
Resultado aqui:
1551106973
Ou seja, ele vai te retornar a timestamp.

Mas você não vai exibir isso pro usuário:
Última atualização: 1551106973 segundos desde 1 de janeiro de 1970.

Vamos ter que usar a strftime() junto com a getlasmod() para formatar corretamente (ou a date() caso prefira exibir os dados em inglês).

Veja como fica nosso código:
<?php
 setlocale(LC_ALL, 'pt_BR.utf8');
 echo "Última atualização: ".strftime('%d/%B/%G as %H:%M:%S ', getlastmod() );
?>
Resultado:
Última atualização: 25/fevereiro/2019 as 12:08:28

Bem mais bonito, não ?

Usando as funções time() e date()

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial de nossa apostila de PHP, vamos aprender a usar a função time() junto da função date() e aprender poderosas técnicas de manipulações de datas.

Apostila PHP Progressivo (baixar)

A função time()

A função time é super mega hiper simples.
Basta invocar: time()

Ela retorna um inteiro: o Unix timestamp atual.
Prontinho. Só isso.

Por exemplo, eu rodando aqui agora: echo time();
O resultado é: 1551028815

Mas convenhamos, esse tanto de segundo, não é muito útil, não quer dizer nada, não dá pra dizer quantos dias, meses ou anos tem aí, não é muito 'legível' para humanos'.

Concorda?

Função date() com função time()

Lembra da função date() ? Responsável por exibir datas e horários de tudo quanto é jeito que você imaginar?

Pois é, podemos combinar ela com a time e exibir datas de maneira que humanos consigam entender e captar de maneira mais interessante.

Por exemplo, para exibirmos uma data no formato: dia-mes-ano
Fazemos: echo date("d/F/Y", 1551028815);

Note que passamos uma timestamp que obtivemos com a time().

Podemos ir mais além e mostrar hora:minuto:segundo:
echo date("d/F/Y - h:i:s", 1551028815);

Ou seja, pegamos o timestamp atual com a função time() e a função date() com seus inúmeros parâmetros, transforma esse número medonho bizarro em datas bonitas e prazerosas.

Exemplo de uso de time()

Crie um script que exibe o horário daqui exatamente uma semana.

Vamos pegar a timestamp atual:
$agora = time();

Agora vamos somar os segundos de uma semana:
$agora += 7*24*60*60;

O script que exibe o dia, mês, ano e horário atual e o exatamente daqui uma semana é:
 <?php
  $proxsemana = time()+(7 * 24 * 60 * 60);
  echo "Atual:" .date("d/F/Y - h:i:s", time())."<br/>";
  echo "Semana que vem: ".date("d/F/Y - h:i:s", $proxsemana)."<br/>";
 ?>
Você pode usar isso para fazer promoções em sites, por exemplo "Você tem apenas uma semana para aproveitar a queima de estoque..."

Como obter tempo atual: Função gettimeofday() do PHP

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial de nosso curso de PHP, vamos aprender para que serve e como usar a função gettimeofday(), para pegar as informações do momento atual do sistema.

Apostila de PHP para download

Obtendo informações atuais: gettimeofday()

Para obtermos algumas informações do exato instante que o sistema PHP está rodando, usamos a função pré-definida gettimeofday().

Quando simplesmente invocamos ela: gettimeofday()
Ela retorna um array, com os seguintes elementos:

  • [sec] - Número de segundos desde a Unix Epoch
  • [usec] - microssegundos atual
  • [minuteswest] - a quantos minutos você está a oeste do meridiano de Greenwich
  • [dsttime] - um inteiro, que representa o horário de verão:


0 - Sem horário de verão
1 - Horário dos EUA
2 - Horário da Australia
3 - Horário do oeste europeu
4 - Horário da europa meridional
5 - Horário do leste europeu
6 - Horário do Canadá
7 - Horário de Grã-Bretanha e Irlanta
8 - Horário da Romênia
9 - Horário da Turquia
10- Horário da Austrália, variação de 1986

Quando eu dou: print_r(gettimeofday());
O que aparece atualmente para mim é:
Array (
[sec] => 1551025438
[usec] => 880119
[minuteswest] => 180
[dsttime] => 0 )

E para vocês? Deixem nos comentários.

Como pegar exato instante atual: gettimeofday(TRUE)

A função gettimeofday()) também aceita como parâmetro o booleano TRUE.
Quando usamos ele, ela retorna apenas um float, com o instante exato do momento atual, com segundos da Unix Epoch e mais 4 casas decimais de microssegundos.

Fazendo: print_r(gettimeofday(TRUE));
Obti: 1551025529.2385

E vocês?

Exercício: Tempo de execução de um script

Uma das funcionalidades da gettimeofday() é descobrir o tempo de execução de um script em PHP.

Primeiro, pegamos o tempo inicial:
$d1 = gettimeofday(TRUE);

Fazemos nosso scripts.

Depois, pegamos o tempo final:
$d2 = gettimeofday(TRUE);

Prontinho, basta subtrair esses valores e teremos o tempo de execução de um script.
Vamos testar com um "Olá, mundo":
<?php
 $d1 = gettimeofday(TRUE);
 echo "Olá mundo<br />";  
 $d2 = gettimeofday(TRUE);
 
 echo "Tempo de execução: ".($d2-$d1);
?>
O resultado aqui foi:
Tempo de execuçãoa: 9.5367431640625E-7

Ou seja: 0,000000954s

Bem rápido esse PHP, não?

A função range () no PHP

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial, vamos aprender a usar a função range(), muito útil para se usar com arrays em PHP.

Recomendado: Baixar apostila de PHP

A função range()

Muitas vezes, é necessário preencher um array com números, ordenados.
Por exemplo, criar um array de 100 elementos, para representar os funcionários de uma empresa e inicializar eles manualmente se torna uma tarefa enfadonha.

Imagina nas lojas virtuais que você vai criar, com milhares de produtos a venda?

A função range() é perfeita para se trabalhar com arrays e ela possui a seguinte sintaxe:
array range(int menor, int maior, int pulo);

Esse pulo, é opcional.
Mas é basicamente assim, você vai fornecer um valor mínimo (menor) e um máximo (maior) e ela te retorna um objeto do tipo array

Por exemplo, vamos criar um dado, um array que vai de 1 até 6:
$dado = range(1, 6);

Pronto, $dado já um objeto do tipo array com 6 elementos (de índices que vão de 0 até 5 - sempre se lembre, em computação se começa contando do 0 e não do 1).

Função range() com salto

Vamos supor que você queira um array com elementos de 1 até 100, mas de 2 em 2.
Ou seja, seus elementos vão ser: 1, 3, 5, 7, 9, ..., 99

Basta fazer: $meuArray = range(1, 100, 2);

Primeiro o ponto de partida, depois o ponto máximo que ele pode chegar e o salto que vai ficar dando como terceiro argumento.

Função range() para Letras
É possível usar a função range com letras também.

Para gerar o alfabeto minúsculo:
$alfaminusculo = range('a', 'z');

Para gerar o alfabeto maiúsculo:
$alfamaiusculo = range('A', 'Z');

E prontinho, automaticamente vai ter um array totalmente preenchido pronto para você usar, seja lá qual for sua necessidade, e acredite, várias vezes você vai precisar usar a range.

Como gerar números aleatórios em PHP: Função rand()

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial de nosso curso de PHP, vamos aprender a gerar qualquer tipo de número aleatório através da função rand() do PHP.

Veja: Apostila de PHP completa para download

Números Aleatórios: Função rand()

Você já viu aqueles captchas malucos ou sistemas que geram códigos para você confirmar no celular ou mesmo senhas aleatórias pra você?

Pois é, gerar valores aleatórios é algo muito importante mesmo no mundo da programação, e o lindo e maravilhoso PHP já possui uma função que faz tudo isso por nós, de maneira automática, é a função rand().

Dê um:
echo rand()

E fique atualizando a página.
Várias, várias vezes.

Vai ver que cada vez que atualiza, aparece um número diferente.
Esse número vai de 0 até getrandmax()

Aqui, esse getrandmax() deu 2147483647, e aí?

Gerando números aleatórios em um intervalo

A função rand() é tão versátil que você pode definir intervalos que você deseja gerar.
Por exemplo, para gerar 0 ou 1 para você brincar de par ou ímpar, faça:
rand(0,1)

Se você quiser simular lançamento de dados, faça:
rand(1,6)

Que ela vai gerar os números 1, 2, 3, 4, 5 e 6 aleatoriamente.

E se quiser um número quebrado? Entre 0.0 e 1.0?
Faça: rand(0,1)/10

Entendeu a lógica ?

Exercício: Criando um jogo em PHP

Crie um script de um game. O PHP vai gerar um número entre 1 e 10, e você vai ficar tentando adivinhar que número foi esse.
Se acertar, diz que acertou e mostra o número.
Se errar, diz que errou, e mostra o número sorteado.

No próximo tutorial vamos te ensinar como fazer esse jogo em PHP.
Como fazer um jogo em PHP

Mais fonte de estudos:
http://php.net/manual/pt_BR/function.rand.php

Lista de exercícios de Funções em PHP

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

  1. Escreva um script que pergunta ao usuário se ele deseja converter uma temperatura de grau Celsius para Farenheit ou vice-versa. Se ele digitar 1, é de Celsius para Farenheit, se digitar 2 é de Farenheit para Celsius, outro valor mostre uma mensagem de erro. Para cada conversão, chame a função correta.
    Conversão Celsius-Fahrenheit
  2. Faça um programa, com uma função que necessite de três argumentos, e que forneça a soma desses três argumentos através de uma função. Seu script também deve fornecer a média dos três números, através de uma segunda função que chama a primeira.
  3. Faça um programa que recebe três números do usuário, e identifica o maior através de uma função e o menor número através de outra função.
  4. A probabilidade de dar um valor em um dado é 1/6 (uma em 6). Faça um script em PHP que simule 1 milhão de lançamentos de dados e mostre a frequência que deu para cada número.
  5. A série de Fibonacci é uma sequência de números, cujos dois primeiros são 0 e 1. O termo seguinte da sequência é obtido somando os dois anteriores. Faça uma script em PHP que solicite um inteiro positivo ao usuário, n. Então uma função exibe todos os termos da sequência até o n-ésimo termo. Use recursividade.
  6. Crie uma função que recebe um inteiro positivo e teste para saber se ele é primo ou não. Faça um script que recebe um inteiro n e mostra todos os primos, de 1 até n.
  7. Um número é dito perfeito quando ele é igual a soma de seus fatores. Por exemplo, os fatores de 6 são 1, 2 e 3 (ou seja, podemos dividir 6 por 1, por 2 e por 3) e 6=1+2+3, logo 6 é um número perfeito. Escreva uma função que recebe um inteiro e dizer se é perfeito ou não. Em outra função, peça um inteiro n e mostre todos os números perfeitos até n.
    Números perfeitos em PHP
  8. Faça um programa para imprimir:
    •     1
          2   2
          3   3   3
          .....
          n   n   n   n   n   n  ... n
      para um n informado pelo usuário. Use uma função que receba um valor n inteiro e imprima até a n-ésima linha
    • Código na apostila

  9. Faça um programa para imprimir:
    •     1
          1   2
          1   2   3
          .....
          1   2   3   ...  n
      para um n informado pelo usuário. Use uma função que receba um valor n inteiro imprima até a n-ésima linha.
  10. Faça um programa, com uma função que necessite de um argumento. A função retorna o valor de caractere ‘P’, se seu argumento for positivo, e ‘N’, se seu argumento for zero ou negativo.
  11. Faça um programa com uma função chamada somaImposto. A função possui dois parâmetros formais: taxaImposto, que é a quantia de imposto sobre vendas expressa em porcentagem e custo, que é o custo de um item antes do imposto. A função “altera” o valor de custo para incluir o imposto sobre vendas.

  12. Faça um programa que converta da notação de 24 horas para a notação de 12 horas. Por exemplo, o programa deve converter 14:25 em 2:25 P.M. A entrada é dada em dois inteiros. Deve haver pelo menos duas funções: uma para fazer a conversão e uma para a saída. Registre a informação A.M./P.M. como um valor ‘A’ para A.M. e ‘P’ para P.M. Assim, a função para efetuar as conversões terá um parâmetro formal para registrar se é A.M. ou P.M. Inclua um loop que permita que o usuário repita esse cálculo para novos valores de entrada todas as vezes que desejar.
  13. Faça uma função que informe a quantidade de dígitos de um determinado número inteiro informado.
    Quantos dígitos tem um número

Funções Recursivas - Recursividade em PHP

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

"Para entender recursividade, tem que saber recursividade".
Ao final deste tutorial de nossa apostila de PHP, vamos entender essa piadinha interna entre programadores.

Recomendo: Apostila de PHP para download


Curso de PHP com certificado
Obter meu certificado!

Função Recursiva

Uma função recursiva é nada mais nada menos que uma função que invoca...ela mesma.
Sim, isso mesmo, é uma função que chama ela mesma.

Obviamente se for só o código da função chamando ela mesmo, essa de dentro também vai chamar ela mesma, que vai chamar de novo ela mesma...e você criou um vírus, que vai consumir toda memória ram do computador (você pode upar esse código para seu servidor web e pegar seus amigos).

Para isso, deve necessariamente haver uma condição em que as funções para de se invocar.
É simplesmente um IF e ELSE.

Se atingir determinado valor de argumento, para de se invocar.
Senão, continua se invocando.

Vamos ver como calcular um somatório, um fatorial e a sequência de Fibonacci usando apenas recursividade.

Somatório com Recursão

Seja F(n) uma função que representa o somatório de um número n, ou seja, é a soma:
F(n) = 1 + 2 + 3 + 4 + ...+ (n-1) + n

Por exemplo:
F(4) = 1 + 2 + 3 + 4 = 10
F(5) = 1 + 2 + 3 + 4 + 5 = 15
...
Porém, note uma coisa:
F(5) = (1 + 2 + 3 + 4) + 5 = F(4) + 5

Ou seja:
F(n) = n + F(n-1)

Então vai funcionar assim:
Vamos criar uma função de somatorio() que chega se o argumento for 1, se for, retorna 1 e acabou o programa.

Se não for 1, retorna n + somatorio(n-1);

Veja como fica o código:
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <form action="" method="get">
  Somatório de: <input type="number" name="number" /><br />
  <input type="submit" name="submit" value="Calcular" />
 </form> 
 <?php
  $numero = $_GET['number'];
  echo "O somatório de $numero é : ".somatorio($numero);
  
  function somatorio($numero){
   if($numero==1)
    return 1;
   else
    return $numero + somatorio($numero-1);
  }
 ?>
 </body>
</html>

Fatorial com Recursão

Explicamos o que é e como calcular em:
Fatorial com laços em PHP

Veja que:
5! = 5 x 4 x 3 x 2 x 1
6! = 6 x 5 x 4 x 3 x 2 x 1 = 6 x 5!

Ou seja:
n! = n * (n-1)!

Por definição, 0!=1 e esse será nosso ponto de parada.
Nosso código fica:
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <form action="" method="get">
  Fatorial de de: <input type="number" name="number" /><br />
  <input type="submit" name="submit" value="Calcular" />
 </form> 
 <?php
  $numero = $_GET['number'];
  echo "O fatorial de $numero é : ".fat($numero);
  
  function fat($numero){
   if($numero==0)
    return 1;
   else
    return $numero * fat($numero-1);
  }
 ?>
 </body>
</html>

Fibonacci com Recursão

Já falamos sobre isso em:
Sequência de Fibonacci com Laços

Faremos, por definição:
F(0) = 0;
F(1) = 1;

E a fórmula com recursividade é:
F(n) = F(n-1) + F(n-2);

O ponto de parada é quando n for 0 ou 1, veja como exibir a sequência de Fibonacci usando recursão:
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <form action="" method="get">
  Fatorial de de: <input type="number" name="number" /><br />
  <input type="submit" name="submit" value="Calcular" />
 </form> 
 <?php
  $numero = $_GET['number'];
  echo "O termo $numero é: ".fibo($numero);
  
  function fibo($numero){
   if($numero==0 || $numero==1)
    return $numero;
   else
    return (fibo($numero-1) + fibo($numero-2));
  }
 ?>
 </body>
</html>

Funções invocando Função

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial de nosso curso de PHP, vamos ver como é a técnica de uma função invocar outra função dentro dela.

Não deixe de ver: Apostila para download

Função invocando Função

Uma das técnicas mais comuns em funções é o ato de uma função invocar outra.
Isso mesmo, dentro de uma função, é normal você invocar outra.

Vamos fazer um script que pede o raio para um usuário e calcula sua área:
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <form action="" method="get">
  Raio: <input type="number" name="ratio" /><br />
  <input type="submit" name="submit" value="Calcular" />
 </form> 
 <?php
  $raio = $_GET['ratio'];
  echo "A área é: ".area($raio);
  
  function area($raio){
   return pi()*pow($raio,2);
  }
 ?>
 </body>
</html>
Note que usamos duas funções
pi() - que retorna o valor matemático de PI
pow() - função de potenciação

Essa é uma técnica bem comum e vamos usar bastante, principalmente no tutorial seguinte, sobre funções recursivas.

Exemplo de função invocando função

Crie um script que receba os coeficientes de uma equação do segundo grau, e diga se ela existe ou não, se tem raízes reais distintas, raízes reais iguais ou raízes imaginárias.

Já fizemos um script que calcula as raízes de uma equação do segundo grau.

Aqui vamos usar duas funções:
equacao() - recebe os 3 coeficientes, a, b e c e diz a classificação dela. Para isso, usa a função seguinte
delta() - função que recebe os 3 coeficientes como argumento e retorna seu valor
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <form action="" method="get">
  Coeficiente a: <input type="number" name="a" /><br />
  Coeficiente b: <input type="number" name="b" /><br />
  Coeficiente c: <input type="number" name="c" /><br />
  <input type="submit" name="submit" value="Calcular" />
 </form> 
 <?php
  $a = $_GET['a'];
  $b = $_GET['b'];
  $c = $_GET['c'];
  
  echo "A equação : ".equacao($a,$b,$c);
  
  function equacao($a,$b,$c){
   $delta=delta($a,$b,$c);
   
    if($a==0)
     return "não existe";
    elseif($delta==0)
     return "duas raízes reais iguais";
    elseif($delta>0)
     return "duas raízes reais distintas";
    else
     return "duas raízes imaginárias";
  }
  
  function delta($a,$b,$c){
   return ($b*$b - 4*$a*$c);
  }
 ?>
 </body>
</html>
Na echo, invocamos a equacao().

A primeira coisa que esta variável faz é calcular o valor de $delta, usando a função delta().
Depois, faz os testes necessários para saber se a equação existe e como são suas raízes.

Note que a função delta() vem até depois da função equacao(), pois quando você invoca uma função o interpretador sai caçando no script, ou nas páginas extras que você adicionou.

Você pode inclusive invocar várias vezes a delta.
Veja como fica agora sem usar a variável $delta, e sim usando a função delta() dentro dos testes condicionais:
 <?php
  $a = $_GET['a'];
  $b = $_GET['b'];
  $c = $_GET['c'];
  
  echo "A equação : ".equacao($a,$b,$c);
  
  function equacao($a,$b,$c){
   
    if($a==0)
     return "não existe";
    elseif(delta($a,$b,$c)==0)
     return "duas raízes reais iguais";
    elseif(delta($a,$b,$c)>0)
     return "duas raízes reais distintas";
    else
     return "duas raízes imaginárias";
  }
  
  function delta($a,$b,$c){
   return ($b*$b - 4*$a*$c);
  }
 ?>

Variáveis de Escopo Global: global e $GLOBALS

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial de nossa apostila de PHP, vamos aprender a usar e criar variáveis de escopo global em nossos scripts PHP.

Aconselhamos: Apostila de PHP Completa para download

Variáveis Globais

Em nosso tutorial anterior, quando falamos em escopo de uma função, dissemos que elas são escopos fechados, que não tem noção de nada de fora nem atrapalham nada fora do seu contexto, endo possível elas obterem informações via parâmetros e dar saídas via return.

Porém existe uma outra maneira de funções verem algo do mundo externo, que é através de variáveis globais.

Para usar uma variável como ela se fosse global, por exemplo $a anteriormente declarada, fazemos:
global $a

Essa técnica tem de diferente o fato de ser possível acessar essa variável de qualquer lugar dentro do script, mesmo dentro de funções, sem que as funções recebam elas como argumento.

Imagine que você quer dar um desconto de 10% em sua loja, simplesmente faça;
$desconto = 0.10;

Depois, sempre que quiser usar essa variável, faça:
global $desconto;
E saia sando normalmente, nativamente o PHP vai entender que está falando daquela variável $desconto que usou no começo do script.

E prontinho, não precisa mais sair definindo variáveis de descontos em milhares de páginas, faça apenas uma declaração, use a palavra-chave global e use esse valor onde quiser, sem precisar declarar nunca mais.

Exemplo de uso de Variável Global

Crie um script que pede um radio de uma circunferência ao usuário.
Através de uma função, exiba o valor do comprimento da circunferência e através de outra, exiba a área. Uso o valor de pi como 3.14

Nesse caso, nossa variável global vai ser o valor de pi
$pi=3.14;

Agora, sempre que quisermos usar a variável global (e não uma outra, como uma local de uma função de mesmo nome, fazemos):
$global $pi;

Pronto, agora podemos usar essa variável nas funções comprimento() e area().
Veja como ficou nosso código:
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <form action="" method="get">
  Raio: <input type="number" name="ratio" /><br />
  <input type="submit" name="submit" value="testar" />
 </form> 
 <?php
  $pi = 3.14;
  $raio = $_GET['ratio'];
  
  echo "Comprimento: ".comprimento($raio)."<br/>";
  echo "Area: ".area($raio)."<br/>";
   
  function comprimento($raio){
   global $pi;
   return (2*$pi*$raio);
  }
  
  function area($raio){
   global $pi;
   return ($pi*$raio*$raio);
  }
 ?>
 </body>
</html>

Variável global com $GLOBALS

A palavra global é como se tivesse o poder de transformar qualquer variável em global, o que pode ser arriscado, por isso use sempre com cautela e muita calma, você pode ter acesso ou  dar acesso para hackers.

O mesmo podemos fazer usando um array (vamos estudar isso em breve), o $GLOBALS, que tem uma lista de todas variáveis do escopo global do script.

Se tem uma variável de nome $nome, acessamos ela globalmente através de:
$GLOBALS['nome']

Veja o script com uso de  $GLOBALS
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <form action="" method="get">
  Raio: <input type="number" name="ratio" /><br />
  <input type="submit" name="submit" value="testar" />
 </form> 
 <?php
  $pi = 3.14;
  $raio = $_GET['ratio'];
  
  echo "Comprimento: ".comprimento($raio)."<br/>";
  echo "Area: ".area($raio)."<br/>";
   
  function comprimento($raio){
   return (2*$GLOBALS['pi']*$raio);
  }
  
  function area($raio){
   return ($GLOBALS['pi']*$raio*$raio);
  }
 ?>
 </body>
</html>
Mais fonte de estudo:
http://php.net/manual/pt_BR/language.variables.scope.php
http://php.net/manual/pt_BR/reserved.variables.globals.php

Passagem por Valor e Passagem por Referência: Escopo de uma função

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial de nosso curso de PHP, vamos aprender como passar argumentos para funções de duas maneiras distintas: passagem por valor e passagem por referência, além de entendermos o escopo de uma função.


O Escopo de uma Função

Vamos criar um script PHP simples, para te explicar o escopo de uma função,
Vamos definir o valor de uma variável:

$a=1;

Em seguida, invocamos uma função dobra(), que recebe $a como argumento, dobra seu valor internamente.

Em seguida, após chamar a função, exibimos o valor de $a.
Ora, como era 1 e dobramos, deve ser 2, correto?

Teste o script:

<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <?php
  $a=1;
  dobra($a);
  echo $a;
  
  function dobra($a){
   $a *= 2;
  }
 ?>
 </body>
</html>

E o resultado é....que runfem os tambores (sempre quis dizer isso)...tcharam...1 !
Isso mesmo, 1!

Ué, mas não tínhamos dobrado?
Na verdade, dobramos OUTRA variável, uma cópia dela...as coisas dentro do escopo de uma função são bem diferentes do que imaginávamos.
Vamos entender melhor.

Passagem por Valor em funções PHP

Quando passamos uma variável como argumento para uma função, a função vai e cria uma CÓPIA dela e passa a trabalhar com ela.

Quando passou $a=1, a função criou outra variável, QUE SÓ EXISTE INTERNAMENTE, copiou o valor 1 e passou a trabalhar com ela.

Essa passagem é chamada por valor, pois passamos só o VALOR para a função, não a variável em si.
Para fazer a função se comunicar com o mundo externo, devemos fazer ela dar um return com seu resultado final, ao passo que fazemos $a receber o retorno dessa função:

Passagem por Referência
E se quisermos passar a variável em si, para que ela seja alterada dentro do escopo da função?
Tem como fazer? Tem sim, via passagem por referência.

Para passar uma variável por referência, basta colocarmos o símbolo & antes do nome da variável, assim: &$a

Vamos refazer o primeiro exemplo, agora com passagem por referência:

<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <?php
  $a=1;
  dobra($a);
  echo $a;
  
  function dobra(&$a){
   $a *= 2;
  }
 ?>
 </body>
</html>

Veja que o valor de $a realmente se alterou e agora é 2!

Isso acontece porque passamos uma referência, o endereço de memória da variável $a, assim, todas as alterações feitas nessa variável, serão feitas diretamente na variável. Tudo isso graças ao operador &.

Então resumindo:
  1. Passagem por valor: os argumentos não são alterados, dentro da função se trabalha com uma cópia dessas variáveis, só o que importa é o valor delas. Se quiser mudar algo, use return para alterar fora da função
  2. Passagem por referência: usamos o operador & que dá acesso diretamente a variável, assim a função vai trabalhar com as variáveis diretamente, alterando seu valor. Geralmente, não se usa return quando se trabalha assim, pois alterações fora da função já estão sendo feitas

Mais escopo de funções

Vamos criar um script onde definimos uma variável:
$curso="PHP Progressivo";

E vamos invocar a função exibe(), que não recebe argumento nenhum, apenas dá um echo na variável $curso:

<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <?php
  $curso="PHP Progressivo";
   
  function exibe(){
   echo $curso;
  }
 ?>
 </body>
</html>

Note o que aconteceu: nada.

Isso porque a função é um mundo a parte, ela não sabe nada do que está acontecendo fora dela.
Ela só tem duas maneiras de comunicação:
Via parâmetros, recebendo argumentos, seja por valor ou referência
Enviando informações vi return

Se a variável $curso não foi passada para ela, ela não sabe o que é isso, nunca viu, nem ouviu.
A função só tem acesso aquilo que você passar para ela de informação, ok?

Função em PHP: Parâmetros, Argumentos e Retorno de uma função

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial de nossa apostila de PHP, vamos aprender o que são parâmetros, argumentos e retorno de uma função que iremos criar.

Função em PHP: Parâmetro e Argumento

Quando demos o exemplo da print(), inserimos dentre parêntesis uma informação, ou seja, um parâmetro, que no caso, é uma string.
<?php
   print("Apostila PHP Progressivo");
?>
"Apostila PHP Progressivo" é o argumento que passamos para a função, que recebe como parâmetro uma string, que foi o que passamos.

A função pow() por exemplo, recebe dois números como parâmetros, a base e o expoente.
Exemplo:
 <?php
   echo "3 elevado a 4: ".pow(3,4);
 ?>
3 e 4 são os argumentos que enviamos pra função.

Retorno de uma função

Como explicamos, as funções são trechos de códigos que fazem coisas específicas e geralmente retornam um valor.

No caso da pow(), ela deve ter uma implementação em algum canto do PHP, com diversas contas matemática dentro dela. Ela recebe dois parâmetros, faz alguns procedimentos e resultado no valor de um número elevado a outro...e retorna esse valor para o local onde a função foi invocada.

No exemplo dado, ela retornou pow(3,4)=81 para a echo, que exibe:
"3 elevado a 4: 81"

Exemplo de uso de função

Vamos declarar uma função, a soma() que vai receber dois parâmetros, dois números, vai realizar a soma e retornar essa soma.

Nossa função fica assim:
function soma($a, $b){
   $soma = $a + $b;
   return $soma;
}

Veja o script:
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <form action="" method="get">
  Numero 1: <input type="number" name="a" /><br />
  Numero 2: <input type="number" name="b" /><br />
  <input type="submit" name="submit" value="Calcular" />
 </form> 
 <?php
  $a = $_GET['a'];
  $b = $_GET['b'];
  
  echo "Soma de $a + $b = ".soma($a, $b);
  function soma($a, $b){
    $soma = $a + $b;
    return $soma;
  }
  
 ?>
 </body>
</html>
Agora basta o usuário inserir dois valores, passarmos esses valores na forma de argumentos para a função e printar o retorno

Exemplo de uso de função
Agora vamos criar uma função que recebe um número como parâmetro e retorna o fatorial deste número.
O escopo dela é:
function fat($n){
   codigo que calcula o fatorial
   return $fatorial;
}
Como já ensinamos a você a calcular o fatorial com laços antes, nosso script fica:
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <form action="" method="get">
  Fatorial de: <input type="number" name="number" /><br />
  <input type="submit" name="submit" value="Calcular" />
 </form> 
 <?php
  $n = $_GET['number'];
  
  echo "Fatorial de $n = ".fat($n);
  
  function fat($n){
   $fatorial=1;
   $count=1;
     
   while($count<=$n){
     $fatorial *= $count;
     $count++;
   } 
   return $fatorial;
  }
  
 ?>
 </body>
</html>

Função - Como invocar e Criar uma função

O PHP Progressivo agora faz parte do Programação Progressiva!

Este conteúdo foi atualizado e movido para o nosso novo endereço.

Redirecionando para: Clique aqui se não for redirecionado

Neste tutorial de nossa apostila de PHP, vamos aprender como invocar, ou seja, como chamar as funções, para fazerem elas serem executadas e vamos aprender a criar funções simples.

Apostila de PHP para Download

Como invocar uma Função

Já usamos, no decorrer de nossa apostila, algumas funções.
A primeira delas foi a print():
<?php
   print("Apostila PHP Progressivo");
?>
Ela funciona como a echo, simplesmente exibe uma string.

Detectamos que é uma função pelo par de parêntesis: print()
As vezes tem algo dentro do parêntesis, as vezes não tem, você entenderam o motivo.

Outra função que vimos, foi a de exponenciação: pow(base, expoente)
 <?php
   echo "3 elevado a 4: ".pow(3,4);
 ?>

pow() é uma função, que recebe dois valores (3 e 4) e retornou um valor, o 81, com o resultado da operação.

É simplesmente assim que invocamos funções.

Como criar uma Função em PHP

Embora o PHP tenha uma vasta gama de funções prontas, escritas em algum lugar, e podendo ser invocada milhões de vezes que você quiser, muitas vezes vamos precisar criar nossas próprias funções.

A sintaxe para declarar uma função é:
function nome_funcao (parameteros) {
   codigo;
   codigo;

   return valor;
}

Ou seja, digitamos function, damos um nome que quisermos a função, vem os parêntesis, os parâmetros que queremos passar para a função, e o par de chaves.

Dentro do par de chaves, vem o código, o corpo da função, onde a mágica vai ocorrer.
Por fim, o comando return que retorna algum valor.

Os parâmetros e return não são obrigatórios e vamos aprender mais adiante como usar eles.

Vamos criar uma função, chamada olamundo() que simplesmente existe "Olá, mundo":
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <?php
   function olamundo(){
    echo "Olá, mundo";
   }
 ?>
 </body>
</html>
Quando rodamos a página, nada acontece.
Nem o Olá, mundo aparece. Por que?

Função é um pedaço de código que fica ali, guardado, na dele.
Só faz algo quando invocamos. Vamos chamar nossa função olamundo():
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <?php
  olamundo();
  
  function olamundo(){
    echo "Olá, mundo";
  }
 ?>
 </body>
</html>
Agora sim, aparece!

Experimente digitar:
olamundo();
olamundo();
olamundo();

Vai aparecer a mensagem 3x. E não tivemos que dar 3 echo.
Cada vez que invocamos, um bloco específico de código é executado, não precisamos ficar repetindo o mesmo código várias vezes.

É só criar funções bem específicas, com tarefas simples e invocar elas.

Vamos agora criar mais uma, a curso()
Que exibe na tela "Curso PHP Progressvo"
<html>
 <head>
  <title>Apostila PHP Progressivo</title>
 </head>
 <body>
 <?php
  olamundo();
  curso();
  
  function olamundo(){
    echo "Olá, mundo<br />";
  }
  function curso(){
    echo "Curso PHP Progressivo<br />";
  }
 ?>
 </body>
</html>
O resultado são as duas strings, printadas no documento HTML.

Captou a ideia por trás das funções?
Calma que estas aí são bem simples, vamos fazer umas mais interessantes no próximo tutorial.

Nomes de funções

Antes de criar suas funções, atenção para algumas coisas:

  • Não deve existir nenhuma outra função com esse nome (nada de criar uma chamada pow(), por exemplo)
  • Só pode conter letra, dígito ou sublinhado
  • Não comece por dígitos
  • Tanto faz ser maiúscula ou minúscula, não são case sensitive, minhafuncao() é a mesma de MINHAFUNCAO()

Veja também

O melhor PC para programar

O melhor celular para programar