Мне было трудно найти какие-либо руководства по этому вопросу, поэтому я решил спросить здесь.
У меня есть объекты, все эти объекты имеют защищенные переменные. Эти переменные защищены, потому что я хочу, чтобы они были доступны для чтения, но только некоторые из них доступны для записи, и я хочу отфильтровать их, когда они будут установлены. Для этого я создал следующий класс, из которого расширяются все другие классы, которые соответствуют этому дизайну:
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. Итак, мои вопросы таковы:
Спасибо!
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
Теперь это позволяет моим объектам, расширяющим мой абстрактный класс, перебирать защищенные переменные.
Других решений пока нет …