Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Porque a variável devo igualar o array a função lista produto?

Durante minha tentativa de recriar o exercício , eu recebia o erro que a varável $produtos era indefinida, embora ela tenha sido definida na função listaProdutos() como um array vazio. Além disso nesta função inserimos cada dado dentro deste array. No fim, só funcionou, porque tive de igualar/atualizar a variável $produtos para a função listaProdutos($conexão). Quero saber porque? Tem a ver com o escopo da função? Exemplo fora da função a váriavel $produtos não tem valor definido e por isso o loop for each não funcionou?

5 respostas

Oi Thiago, pode ser que sim, preciso ver o código que fez pra confirmar. Você cola o antes e depois aqui pra gente ver?

Primeiro otimizamos para a função abaixo. Cujo o retorno é é o array $produtos;

<?php
function listaProdutos($conexao) {
    $produtos = array();
    $resultado = mysqli_query($conexao, "select * from produtos");

    while($produto = mysqli_fetch_assoc($resultado)) {
        array_push($produtos, $produto);
    }

    return $produtos;

}
?>

Depois temos o seguinte código, o qual não funcionou:

<?php
listaProdutos($conexao);
?>
<table class="table table-striped table-bordered">

<?php
foreach($produtos as $produto) {
?>

    <tr>
        <td><?= $produto['nome'] ?></td>
        <td><?= $produto['preco'] ?></td>
    </tr>

<?php
}
?>
</table>

(Os includes foram devidamente inseridos antes desse pedaço do código). Este código retornou o erro que o paramêtro do foreach estava errado, porque a váriavel $produtos não estava definida. Somente quando eu eu defino ou atualizo (não sei ao certo) a variável $produtos igual a função que eu consigo o retorno dos dados no banco.

<?php $produtos = listaProdutos($conexao); ?> Minha dúvida é porque devo fazer isso, se o próprio retorno da função é o array $produtos? Se eu chamasse somente a função não resolveria?!

solução!

Agora sim entendi a sua dúvida Thiago! Bom, você está certo, o retorno é feito, mas ele retorna para onde?

Quando você usa um return dessa forma, você encerra a execução da função e o valor retornado por ela precisa ser capturado em algum lugar ou então vai se perder na memória.

Entende? É justamente o que você comentou sobre escopo. A variável produtos que está dentro da função, está dentro do escopo da função e fora dela, a variável não existe. Por isso você cria outra, fora do escopo, que captura o valor retornado pela função.

Obrigado Wanderson! Acredito que ficou claro. Também dei uma pesquisada no manual do PHP. Lá, eles dão um exemplo que se encaixe neste caso, ou seja, quando o retorno da função for um array que pode assumir múltiplos valores . Seguem os exemplos: Examplo #1 Use of return

<?php function square($num) { return $num * $num; } echo square(4); // outputs '16'. ?>

A function can not return multiple values, but similar results can be obtained by returning an array.

Examplo #2 Returning an array to get multiple values

<?php function small_numbers() { return array (0, 1, 2); } list ($zero, $one, $two) = small_numbers(); ?>

1º Como bem foi explicado por você, a variável $produtos foi somente definida no escopo da função. 2º Como a função possui o return, o script da função foi encerrado. Portanto, a variável só "existe" e é definida no arquivo de origem que é o banco-produto.php.

Então por convenção e conveniência não há problema em inserir a variável de mesmo com o valor da função, uma vez que a função retorno um array de mesmo nome. me corrija se estiver errado.

Opa, está certo, mas há uma observação: o nome da variável que recebe o valor retornado pela função não precisa ser o mesmo nome de uma variável que está dentro da função. Pode ser qualquer nome.

Só precisa usar o mesmo nome para o foreach neste caso.