2011-08-04 24 views

Trả lời

3

Ví dụ cho việc mở rộng một Iterator:

class Foo extends ArrayIterator 
{ 
    public function valid() { 
     $result = parent::valid(); 

     if (!$result) { 
      echo 'after'; 
     } 

     return $result; 
    } 
} 

$x = new Foo(array(1, 2, 3)); 

echo 'before'; 
foreach ($x as $y) { 
    echo $y; 
} 

// output: before123after 
+0

trong khi đó hoạt động, nó là bẩn để làm như vậy bởi vì phương pháp hợp lệ có tác dụng phụ ngay bây giờ. Xem câu trả lời của tôi cho một cách tiếp cận sạch hơn. – Gordon

+0

@Gordon Bạn đúng. OP nên chọn phương pháp bạn đã hiển thị. – Yoshi

2
function valid(){ 
    $isValid=...; 
    if(!$isValid) 
     doStuff(); 
    return $isValid; 
} 
3

Mở rộng một iterator để quá tải valid() không phải là một phương pháp tốt vì bạn đang bổ sung thêm chức năng vào hợp lệ() mà không thuộc về đó. Một cách tiếp cận hơi sạch sẽ được sử dụng:

class BeforeAndAfterIterator extends RecursiveIteratorIterator 
{ 
    public function beginIteration() 
    { 
     echo 'begin'; 
    } 
    public function endIteration() 
    { 
     echo 'end'; 
    } 
} 

và sau đó làm

$it = new BeforeAndAfterIterator(new RecursiveArrayIterator(range(1,10))); 
foreach($it as $k => $v) { 
    echo "$k => $v"; 
} 

mà sau đó sẽ cung cấp cho

begin0 => 11 => 22 => 33 => 44 => 55 => 66 => 77 => 88 => 99 => 10end 

Hai phương pháp này là không quan trọng để quá tải, vì họ là đặc biệt cho rằng mục đích và không có hành vi được xác định trước (nhớ rằng tôi không gọi phương thức cha mẹ).

Các vấn đề liên quan