Ir para conteúdo

POWERED BY:

Arquivado

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

Bruno Augusto

[Resolvido] FilterIterator...

Recommended Posts

Queria saber se é possível ver, e obviamente manipular de outras formas, aquilo que se passa por um FilterIterator depois dela filtrar.

 

Vejam esse exemplo:

 

<?php

class Teste {

   public function __construct() {}

   final public function strip() {}

   private function trim() {}

   public function getInput() {}
}

class ClassesIterator extends FilterIterator {

   public function __construct( \Iterator $iterator ) {

       parent::__construct( $iterator );

       $this -> rewind();
   }

   public function accept() {

       $method = $this -> getInnerIterator() -> current();

       return ( $method -> isFinal() && ! $method -> isConstructor() );
   }
}

Para todos os efeitos minha intenção nesse exemplo é filtrar os métodos de uma classe, obtidos com a Reflection, para ter apenas os públicos, finais e que não seja o construtor:

 

$reflector = new ReflectionClass( 'Teste' );

$filtered = new ClassesIterator( new ArrayIterator( $reflector -> getMethods( ReflectionMethod::IS_PUBLIC ) ) );

Se eu der um var_dump() em $filtered::getInnerIterator(). obviamente terei os dados presentes no ArrayIterator passado mas que ainda não foram filtrados, isto é:

 

object(ArrayIterator)[3]

   object(ReflectionMethod)[4]
     public 'name' => string '__construct' (length=11)
     public 'class' => string 'Teste' (length=5)
 &
   object(ReflectionMethod)[5]
     public 'name' => string 'strip' (length=5)
     public 'class' => string 'Teste' (length=5)
 &
   object(ReflectionMethod)[6]
     public 'name' => string 'getInput' (length=8)
     public 'class' => string 'Teste' (length=5)

E se faço sobre $filtered, tenho "nada", isto é, só a declaração do objeto.

 

Agora, num foreach:

 

foreach( $filtered as $methods ) {

   var_dump( $methods );
}

Vejo corretamete aquilo que se espera:

 

object(ReflectionMethod)[5]
 public 'name' => string 'strip' (length=5)
 public 'class' => string 'Teste' (length=5)

É possível não depender desse foreach?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre esse "construtor do construtor", é que eu removi o comentário de dentro dele. Mas é por causa de um bug já reportado em que as vezes o primeiro elemento é ignorado.

 

Já quanto à iterator_to_array(), se o iterator não tiver um método que retorne seu conteúdo como array, como ArrayIterator::getArrayCopy(), daí tudo bem usar essa função.

 

Mas como, pelo menos pra mim, quase sempre uso ArrayIterator e ele o tem, nem preciso dessa função. Na verdade, nem preciso invocar tal método, basta forçar o cast para array.

 

Acho que você estava com iterator_apply() na cabeça, não?

 

Mas tudo bem, era só uma curiosidade mesmo. :thumbsup:

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.