Skip to content

php 배열과 Iterator 패턴 질문입니다. #113

Description

@dwagwa

안녕하세요 별로 중요한 내용은 아닌 것 같지만
해보다가 의문이 생겨서 질문 드립니다.
일단 코드 전체는 이렇습니다.

-------------memberclass.php-------------------------
<?php
class Member{
    private $id;
    
    public function __construct($id) {
        $this->setID($id);
    }
       public function getID(){
        return $this->id;
    }
}
 class Members implements IteratorAggregate{
    private $members = [];
    public function add(Member $member){
      $this->members[] = $member;
    }
    public function getIterator(){
      return new ArrayIterator($this->members);
    }
  }
?>
------------------------iterator.phph-------------------------
<?php
 require_once 'memberclass.php';

  $member1 = new Member(1);
  $members = new Members;
  $members->add($member1);
  $iterator = $members->getIterator();
  
  foreach($iterator as $member){
    print $member->getID()." ";
  }
?>

그리고 제 질문을 드리겠습니다. 일단

$arr = [];

와 같은 배열이 있다고 합시다.
그리고

$num1 = 1;
$num2 = 2;

와 같이 선언된 변수가 있습니다.
여기에

$arr[] = $num1;
$arr[] = $num2;

와 같이 작성하면 배열 arr[0]과 arr[1]에 각각 1과 2가 들어갈 것입니다.

그리고

$arr = $num1;
$arr = $num2;

와 같이 작성하면 마지막에 대입한 $num2만 배열 arr에 들어가지요?
아마 배열 이름에 []를 붙이지 않으면 자동으로 배열이름[0]을 뜻하는 것 같아 보입니다.
그리고 count($arr)로 길이를 확인해 보면 1이 나옵니다.

그런데
제가 올린 코드에서

class Members implements IteratorAggregate{
    private $members = [];
    public function add(Member $member){
---->> $this->members = $member; // $this->members[]를 $this->members 로 잘못 작성한 것입니다.
    }
    public function getIterator(){
      return new ArrayIterator($this->members);
    }
}

와 같이 실수로 작성해 놓았을 경우
앞에서와 같이
적어도 members[0]에 $member1의 데이터가 들어가야 하는 것이 아닌가 싶은데요
일단 데이터는 들어 가는 것 같은데

members배열을 반환받은 $iterator의 길이를

count($iterator)

와 같이 확인해보면 0으로 나옵니다
그런데

print_r($iterator)

으로 확인해 보면 일단 데이터는 들어가 있습니다.
그런데 또

foreach($iterator as $member){
    print $member->getID()." ";
    
  }

와 같이 데이터를 확인하려고 하면 아무것도 출력하지 못하네요

왜 이런일이 생기는건가요?

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions