Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

João Batista Neto

1.8 SPL - GlobIterator

Recommended Posts

Anteriormente falamos sobre LimitIterator, sua semelhança com a cláusula LIMIT do MySQL e como podemos limitar os elementos de um Iterator, hoje falaremos de um outro Iterator da SPL chamado GlobIterator. Quem já trabalhou com a função glob() para listar os arquivos de um determinado diretório deverá notar a semelhança.

Como muitas vezes, permitimos que nossos clientes façam upload de imagens em nossas aplicações, constantemente precisamos exibi-las de volta ao cliente, se nosso sistema utiliza um diretório específico para o cliente, podemos utilizar o Iterator GlobIterator para percorrer essas imagens:

<?php
$glob = new GlobIterator( 'public/images/*.jpg' );

foreach ( $glob as $key => $current ){
echo $current->getPathname() , PHP_EOL;
}



A saída:

public/images/imagem01.jpg
public/images/imagem02.jpg
public/images/imagem03.jpg
public/images/imagem04.jpg
public/images/imagem05.jpg
public/images/imagem06.jpg
public/images/imagem07.jpg
public/images/imagem08.jpg
public/images/imagem09.jpg
public/images/imagem10.jpg
public/images/imagem11.jpg
public/images/imagem12.jpg
public/images/imagem13.jpg
public/images/imagem14.jpg
public/images/imagem15.jpg
public/images/imagem16.jpg
public/images/imagem17.jpg
public/images/imagem18.jpg
public/images/imagem19.jpg
public/images/imagem20.jpg


Como podem ver, o GlobIterator recebe um caminho onde deverá recuperar os arquivos e podemos utilizar o wildcard * para buscar todos os arquivos .jpg de uma determinada localização, o funcionamento do GlobIterator, como pode ser visto, é bastante semelhante à função glob(). Da forma que foi utilizado, cada elemento retornado é uma instância de SPLFileInfo, onde podemos recuperar várias informações do arquivo.

Agora, imaginem que nosso layout permita a exibição de apenas 5 imagens de cada vez. Com esse monte de imagens, quebraremos o layout, então, precisamos paginá-los de forma a adequar ao layout.

Como vimos anteriormente que a LimitIterator pode ser utilizada também para paginação, vamos ver como ficaria:

$glob = new GlobIterator( 'public/images/*.jpg' );
$show = 5;
$page = isset( $_GET[ 'pos' ] ) ? (int) $_GET[ 'pos' ] : 0;

foreach ( new LimitIterator( $glob , $page , $show ) as $key => $current ){
echo '<img src="' , $current->getPathname() , '" alt="imagem" />' , PHP_EOL;
}

echo '<ul class="paginas">' , PHP_EOL;

for ( $i = 0 , $j = 1 , $t = $glob->count() ; $i < $t ; $i += $show , ++$j ){
echo '<li><a href="' , $_SERVER[ 'PHP_SELF' ] , '?pos=' , $i , '">' , $j , '</a></li>' , PHP_EOL;
}

echo '</ul>';



O que fizemos:

1. Definimos uma variável $show com um valor 5, esse é o total de imagens que serão mostradas.
2. Definimos uma variável $page que receberá via GET a posição que o Iterator irá iniciar, definida pelo campo POS, se não for passado nenhum valor, iniciamos com 0
3. Criamos uma UL onde cada LI conterá um link para uma página que passará via GET o campo POS com o valor que nosso iterator iniciará

A saída será:

<img src="public/images/imagem01.jpg" alt="imagem" />
<img src="public/images/imagem02.jpg" alt="imagem" />
<img src="public/images/imagem03.jpg" alt="imagem" />
<img src="public/images/imagem04.jpg" alt="imagem" />
<img src="public/images/imagem05.jpg" alt="imagem" />
<ul class="paginas">
<li><a href="/tmp/dummy.php?pos=0">1</a></li>
<li><a href="/tmp/dummy.php?pos=5">2</a></li>
<li><a href="/tmp/dummy.php?pos=10">3</a></li>
<li><a href="/tmp/dummy.php?pos=15">4</a></li>
</ul>



Cada vez que clicamos em 1 dos links, o campo POS é passado via GET, por exemplo, supondo que tenhamos clicado no link da página 3, a saída será:

<img src="public/images/imagem11.jpg" alt="imagem" />
<img src="public/images/imagem12.jpg" alt="imagem" />
<img src="public/images/imagem13.jpg" alt="imagem" />
<img src="public/images/imagem14.jpg" alt="imagem" />
<img src="public/images/imagem15.jpg" alt="imagem" />
<ul class="paginas">
<li><a href="/tmp/dummy.php?pos=0">1</a></li>
<li><a href="/tmp/dummy.php?pos=5">2</a></li>
<li><a href="/tmp/dummy.php?pos=10">3</a></li>
<li><a href="/tmp/dummy.php?pos=15">4</a></li>
</ul>



Bom, por hoje é só, bem curtinho o tópico de hoje já GlobIterator deriva de FilesystemIterator e falaremos mais a fundo da FilesystemIterator em outro tópico da série PHP Orientado a Objetos.

Imagem Postada

 

 

Índice Imagem Postada

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom.

 

Só não entendi o porquê de ++$j ao invés de $j++. Existe alguma diferença, nesse caso, de ser feito um pré-incremento?

Compartilhar este post


Link para o post
Compartilhar em outros sites

é pq ele incrementa a variavel antes de executar a instrução

 

<?php
   $foo = 2;
   echo 'Pré-Incremento' . ++$foo; // 3
   echo 'Pós incremento' . $foo++; // 3
?>

edit: desculpa axo q nem era essa sua duvida.. hehe

 

--

 

eu até agora nao entendi o uso de PHP_EOL;

 

=\

 

outra coisa.. onde você ta criando a class globiterator ? o.O

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe alguma diferença, nesse caso, de ser feito um pré-incremento?

 

Meramente desempenho, não influi em nada além disso na execução do código.

 

eu até agora nao entendi o uso de PHP_EOL;

 

EOL http://forum.imasters.com.br/public/style_emoticons/default/seta.gif End Of Line http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Fim da linha

 

PHP_EOL é uma constante do PHP que terá o caracter de fim de linha (quebra de linha), independentemente do sistema operacional, no Linux o caracter é \n e no Windows é \r\n, para que não tenha que ficar testando qual o ambiente ou, assumir \n ou \r\n e não funcionar adequadamente em qualquer sistema, usa-se o PHP_EOL que funcionará em qualquer ambiente.

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

criaçao da class globiterator?

 

GlobIterator é uma classe da SPL, o que significa que eu não estou criando nada, estou apenas a utilizando http://forum.imasters.com.br/public/style_emoticons/default/seta.gif http://br.php.net/manual/en/class.globiterator.php

 

Todas as classes e interfaces apresentadas nesse capítulo, a partir do 1.6, são SPL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ham.. é uma classe já definida no php entao ?

 

meio q boiei nessa parte haha

 

:P

 

Então, , para compreender direito, é importante acompanhar o curso inteiro, de preferência na ordem em que foram postados. A resposta sobre as SPL está neste tópico aqui. Para maiores informações, temos também o link para o manual.

 

E, tendo mais dúvidas, pergunte sempre.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ham.. é uma classe já definida no php entao ?

uhum .. a spl é um recurso nativo, e importante para oop em php.. tanto que o joao dedica um capitulo intero.. por exemplo c# é orientado a objetos assim sendo ele trabalha somente com objetos.. tipo se tu tem uma variavel int (integer) pra imprimir tem que acessar o metodo tostring()..ja em php não é orientado a objetos mas sim tem suporte a orientacao objeto por exemplo se tu atribui a variavel a um numero ela vai se um numero.. e nao um objeto =] nessa parte que a spl uma força =] tipo quando tu recupera os dados do banco .. ou quando vai fazer uma listagem .. você pode trabalhar com objetos no lugar de arrays ^^

 

sei la mais ou menos isso.. eu acho :P

 

valww

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ham.. é uma classe já definida no php entao ?

uhum .. a spl é um recurso nativo, e importante para oop em php.. tanto que o joao dedica um capitulo intero.. por exemplo c# é orientado a objetos assim sendo ele trabalha somente com objetos.. tipo se tu tem uma variavel int (integer) pra imprimir tem que acessar o metodo tostring()..ja em php não é orientado a objetos mas sim tem suporte a orientacao objeto por exemplo se tu atribui a variavel a um numero ela vai se um numero.. e nao um objeto =] nessa parte que a spl uma força =] tipo quando tu recupera os dados do banco .. ou quando vai fazer uma listagem .. você pode trabalhar com objetos no lugar de arrays ^^

 

sei la mais ou menos isso.. eu acho :P

 

valww

 

A partir de agora temos que ter muito cuidado ao se referenciar ao PHP como uma linguagem que 'tem suporte a objetos'.

 

O PHP 5.3 veio para dar um gostinho do que será o PHP 6, um modelo totalmente completo de orientação a objetos, comparado ao Java e C#.

 

Inclusive, nesta versão atual, temos um recurso interessantíssimo chamado Indução de Tipo, que faz justamente o que diz: induz uma tipagem a uma variável qualquer.

 

É claro que o PHP não vai perder uma das suas mais legais características, que é a tipagem fraca. Mas a partir disso teremos uma espécie de tipagem opcional.

 

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parabéns voltou a ficar simples e de fácil entendimento! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Derepente de Atirei o pau no Gato, você pulo para Atirei o pau no Tigre. rsss

 

Brincadeiras a parte, mas o curso ta show http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.