Как вы перебираете свойства текущего класса (не унаследованные от родительского или абстрактного класса)? - PullRequest
4 голосов
/ 11 октября 2010

Я знаю, что PHP5 позволит вам перебирать свойства класса. Однако, если класс расширяет другой класс, он будет также включать все те свойства, которые объявлены в родительском классе. Это нормально и все, без нареканий.

Однако я всегда понимал SELF как указатель на текущий класс, а $ this также указывает на текущий объект (включая вещи, унаследованные от родителя)

Есть ли способ, которым я могу перебирать ТОЛЬКО свойства текущего класса. Причина, по которой я спрашиваю это ... Я использую CI и перебираю $, это включает в себя тонны родительских свойств, которые мне не нужны.

<?php

class parent 
{
   public $s_parent = "Parent sez hi!";
   public $i_lucky_number = 6;
}

class child extends parent
{
   public $s_child = "Child sez hi!";
   public $s_foobar = "What What!!";
   public $i_lucky_number = 7;

   public iterate()
   {
      foreach ($this as $s_key => $m_val)
      {
          echo "$s_key => $m_val<br />\n";
      }
   }

}

$o_child = new child();
$o_child->iterate()

Выход

s_parent => Parent sez hi! 
s_child => Child sez hi! 
s_foobar => What What!!
i_lucky_number => 7

Я не хочу видеть "s_parent => Parent sez hi!"

Я просто хочу перебрать свойства текущего класса. Не те, что унаследованы в другом месте.

Заранее спасибо.

1 Ответ

11 голосов
/ 11 октября 2010

Используя методы Reflection, вы можете сделать следующее:

public function iterate()
{
  $refclass = new ReflectionClass($this);
  foreach ($refclass->getProperties() as $property)
  {
    $name = $property->name;
    if ($property->class == $refclass->name)
      echo "{$property->name} => {$this->$name}\n";
  }
}
...