Есть некоторый класс:
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;