[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Про Iterator
yuriy
Привет!
Есть некоторый класс:


class a implements Iterator {

private $a = 'null';
protected $b = 9;
public $c = 1112;
private $d = 445;

public function current() { //... }

public function key() { //... }

public function next() { //... }

public function rewind() { //... }

public function valid() { //... }

public function f() {

foreach ($this as $key => $value)
echo $key . ' => ' . $value . '<br>';

}
}



Стоит задача сделать так, чтобы функция f() работала так, как будто класс и не реализует никакой интерфейс Iterator, то есть в цикле можно пробежаться по всем членам класса, в том числе и закрытым. А вот вне класса работал бы уже интерфейс Iterator как положено, с вызовами соответствующих функций интерфейса. Как сделать, кто-нибудь пробовал?



Спустя 34 минуты, 46 секунд (29.02.2012 - 12:51) SlavaFr написал(а):
по закрытм пропертис пробежать можно только с версии 5.3. По открытм при помощи Рефлекции. Гдето так:

class X{
function f(){
$class=new ReflectionClass(get_class($this));
foreach($class->getProperties() as $property){
if(!$property->isPrivate()){
echo $property->getName().'='.$property->getValue($this)."<br />\n";
}
}
}
}


class Y extends X{
private
$a='a',
$b='b';
public
$c=5,
$d='phpfourum.ru';
}

$Test= new Y;

$Test->f();

Спустя 4 минуты, 1 секунда (29.02.2012 - 12:55) yuriy написал(а):

class a {

private $a = 'null';
protected $b = 9;
public $c = 1112;
private $d = 445;



public function current() {}

public function key() {}

public function next() {}

public function rewind() {}

public function valid() {}

public function count() {}

public function getIterator() {

return new gen_Titerator($this);

}

public function f() {

foreach ($this as $key => $value)
echo $key . ' => ' . $value . '<br>';

}

}


class gen_Titerator implements Iterator {

private $_director = null;

public function __construct($director) {

$this->_director = $director;

}

public function current() {

return $this->_director->current();

}

public function key() {

return $this->_director->key();

}

public function next() {

$this->_director->next();

}

public function rewind() {

$this->_director->rewind();

}

public function valid() {

return $this->_director->valid();

}

}


$a = new a();

foreach ($a->getIterator() as $key => $value)
echo $key . ' => ' . $value . '<br>';

echo '<br>';

foreach ($a as $key => $value)
echo $key . ' => ' . $value . '<br>';

echo '<br>';

$a->f();


Ну вот, вроде типа того.


_____________
void x;
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.