oop — перебирать защищенные переменные в классе php

Мне было трудно найти какие-либо руководства по этому вопросу, поэтому я решил спросить здесь.

У меня есть объекты, все эти объекты имеют защищенные переменные. Эти переменные защищены, потому что я хочу, чтобы они были доступны для чтения, но только некоторые из них доступны для записи, и я хочу отфильтровать их, когда они будут установлены. Для этого я создал следующий класс, из которого расширяются все другие классы, которые соответствуют этому дизайну:

abstract class UnitObject{
protected $setables = [];

abstract public function filter($value);

public function __set($name, $value)
{
if ( in_array($name, $this->setables) ) {
$this->{$name} = $this->filter($value);
} else {
/*
* Log something
*/
}
}

public function __get($name)
{
return $this->{$name};
}
}

Теперь это достижение желаемого результата. Однако я хотел бы, чтобы эти защищенные переменные были доступны через цикл foreach для перебора свойств объекта. Поскольку они не «видимы» в традиционном смысле, код по умолчанию, похоже, не работает для этого. После некоторых исследований я обнаружил, что могу реализовать Iterator для выполнения чего-то подобного, но все примеры, если я реализовал это на конкретном объекте.

Моя цель состоит в том, чтобы реализовать итератор для моего «UnitObject», от которого наследуются мои дети, и написать необходимые методы, чтобы они могли вращать свойства всех переменных этого объекта при использовании цикла foreach. Итак, мои вопросы таковы:

  1. Является ли реализация итератора лучшим методом для решения этой проблемы?
  2. Можно ли использовать абстрактный родительский класс, который реализует Iterator и в котором этот класс содержит требуемые функции, или мне нужно будет создавать требуемые функции для каждого конкретного объекта?
  3. Наконец, если это возможно, не могли бы вы привести пример или направить меня к источнику, у которого есть хороший пример?

Спасибо!

-1

Решение

ryantxr, спасибо, что ты на самом деле был довольно близок к тому, что мне нужно было сделать. Я нашел решение после того, как стал более компетентным с реализацией итератора. Вот код, который я добавил в мой абстрактный класс UnitObject:

    /*
* Functions to allow protected and private variables to be iterated over
*/

private $variablePosition = 0;
private $variableArray = [];

public function rewind()
{
$this->variableArray = array_keys(get_object_vars($this));
$this->variablePosition = 0;
}

public function current()
{
return $this->{$this->key()};
}

public function key()
{
return $this->variableArray[$this->variablePosition];
}

public function next()
{
++$this->variablePosition;
}

public function valid()
{
return isset($this->variableArray[$this->variablePosition]);
}

*Note: I also had to implement Iterator on my UnitObject class

Теперь это позволяет моим объектам, расширяющим мой абстрактный класс, перебирать защищенные переменные.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]