Маленькая хитрость, чтобы перебрать свойства класса в PHP


В PHP есть маленькая хитрость, о которой я узнал сегодня. Суть в том, что вы можете пройтись по всем свойствам класса, имеющим «публичную» видимость, просто перебирая объект класса, используя такую ​​конструкцию цикла, как foreach,

Возьмите следующие, например,


class MyClass
{
    public $prop1 = 'property 1';
    public $prop2 = 'property 2';
    public $prop3 = 'property 3';

    protected $prop4 = 'protected property';
    private $prop5 = 'private property';
}

$object = new MyClass();

foreach($object as $key => $value) {
    print "$key => $valuen";
}
?>

Запуск над кодом напечатает следующее,

prop1 => property 1
prop2 => property 2
prop3 => property 3

Как видите, все, что нам нужно было сделать, это перебрать объект класса, который подберет все «публичные» свойства, где «ключ» – это имя свойства, а «значение» – это значение, присвоенное свойству.

Есть, однако, одна проблема с вышеупомянутым подходом. protected и private свойства не могут быть повторены. Итак, что вы можете сделать, чтобы решить эту проблему, определить метод, который перебирает все свойства класса, используя $this, На этот раз он также заберет protected и private Свойства как метод является членом класса.

Приведенный выше пример можно переписать так.


class MyClass
{
    public $prop1 = 'property 1';
    public $prop2 = 'property 2';
    public $prop3 = 'property 3';

    protected $prop4 = 'protected property';
    private $prop5 = 'private property';

    public function iterateAllProperties()
    {
       foreach ($this as $key => $value) {
           print "$key => $valuen";
       }
    }
}

$object = new MyClass();

$object->iterateAllProperties();
?>

Запуск над кодом напечатает следующее,

prop1 => property 1
prop2 => property 2
prop3 => property 3
prop4 => protected property
prop5 => private property

Как видите, на этот раз были напечатаны все свойства класса, включая protected и private из них.

Однако есть более приятный интерфейс Итератор который может быть реализован на классе. Итератор позволяет объекту определять, как он будет повторяться и какие значения будут доступны на каждой итерации, используя такие методы, как current(), next() и key(), Я расскажу об этом в другой статье.

До скорого.