我有我的類爲框架提供的迭代器提供額外的功能,同時從用戶隱藏該迭代器。所以我想用delegation來完成大部分任務。如何在PHP中正確安全地委派迭代器?
我的類只需要在當前元素下操作,所以我想我真正需要的是在框架提供的迭代器中執行特定於迭代器的函數,我保留在私有字段中?或者我錯過了什麼?
所有其他方法在當前元素上運行或無論如何都是獨立的。
我有我的類爲框架提供的迭代器提供額外的功能,同時從用戶隱藏該迭代器。所以我想用delegation來完成大部分任務。如何在PHP中正確安全地委派迭代器?
我的類只需要在當前元素下操作,所以我想我真正需要的是在框架提供的迭代器中執行特定於迭代器的函數,我保留在私有字段中?或者我錯過了什麼?
所有其他方法在當前元素上運行或無論如何都是獨立的。
(我不是這方面的專家,但我很悲傷地看到問題,像這樣的答案。希望別人總有一天會一步更好的東西。)
最簡單的方法似乎是繼承像ArrayObject之類的東西。
另一種方法是定義一個抽象基類,通過委託給傳遞給構造函數的另一個迭代器(類似於基本示例@http://php.net/manual/en/class.iterator.php)來實現Iterator方法。
只是跑過這個我以前沒有注意到的老問題(不幸的是!)。
PHP中的委託可以通過修飾器進行處理。
代表迭代器在具體是很容易實現與IteratorIterator class。迭代器模式也是一個裝飾器模式,所以已經有了這個好的類可以重用。
它並沒有完全隱藏裝飾好的迭代器(see getInnerIterator()
),但是您最終可能不會在意最終的委託。
讓我們看一個例子來委託對Iterator::current()
:
class Delegate extends IteratorIterator
{
public function current() {
$current = parent::current();
// do your delegated operation on $current
return $current;
}
}
然後,您可以通過將迭代器的委託創建委託:
$delegate = new Delegate($iterator);
然後使用代替原來的迭代器委託。
有時您需要一個真正的裝飾器,將原始迭代器作爲主體進行完全包裝。這樣一個例子在Iterator-Garden中可用:IteratorDecorator。