2012-11-19 3 views
1

나는 PHP의 읽기 전용 모음을 찾고 있습니다. 이미 검색했지만 기본 구현을 아직 찾을 수 없습니다. 나는 확실히 이런 식으로 뭔가를 필요로하는 최초의 프로그래머가 아니라고 생각합니다 :읽기 전용 컬렉션

내 상황은 다음과 같습니다. 카트 클래스에 많은 cartItem이 포함되어 있습니다. cartItem은 카트를 통해서만 편집 가능해야합니다 (집계 루트). 이러한 항목을 표시하려면 장바구니에서 컬렉션 유형을 반환해야합니다. 이 컬렉션의 항목은 이미 읽기 전용으로 만들어져 있습니다. 컬렉션을 참조로 전달하는 것을 선호하므로 공유 컬렉션은 항상 최신 상태입니다. (심지어 컬렉션을 추출한 후 항목을 제거/추가한다고 생각한 경우).

항목은 장바구니의 ArrayObject 안에 저장됩니다. ArrayObject를 읽기 전용으로 랩핑하는 네이티브 클래스가 있습니까? 그렇지 않다면 다른 래퍼 컬렉션에 대해 래퍼가 존재합니까? 아니면 직접 작성해야합니까?

+0

배열에 empty()가 포함 된 배열이 있는지 확인하는 if 문을 쓰지 않는 이유는 무엇입니까? – Lucas

+0

OO * 사유 재산 *. –

+0

@ 루카스 나는 당신의 질문을 이해하지 못합니다. 내 질문에 컬렉션에 객체가 포함되어 있는지 확인하는 것과는 아무런 관련이 없습니다. @ dagon 제 콜렉션은 비공개입니다. 그러나 읽기 전용 버전을 게시하지 않으려합니다. –

답변

1

이 토론에서 나는 나의 문제를 해결하는 아이디어를 가지고 있었다 : 나는 내 카트가 반복자를 구현하도록했다. 그래서 내보기는 내 장바구니와 그 항목을 표시 할 수 있습니다. 결과적으로 카트는 항상 읽기 전용 cartItemObjects를 반환합니다. 따라서 컬렉션을 게시 할 필요가 없습니다. 참여해 주셔서 감사합니다.

1

클래스에서 사용할 수있는 유형의 private 유형을 활용하면 스스로 직접 작성해야합니다. 이것이 내가 생각할 수있는 유일한 실행 가능한 길입니다. Reflection을 사용하여 우회 할 수 있으므로이 방법도 방탄되지 않습니다. 아직도, 그것은 평범한 격언을 따른다. 누군가 그것을 부수기를 원한다면, 그것을 깨뜨릴 것이다.

더 큰 클래스의 전용 속성으로 ArrayObject를 감싸고 클래스의 메서드 (정적 또는 동적, 중요하지 않음)를 통해서만 개체에 액세스 할 수 있도록 허용합니다. 이렇게하면 인위적으로 읽을 수있게하고 (마술 방법 __get()이 마음에 듭니다.) 글을 쓸 수는 없으므로 가능한 한 가장 가까운 일치 항목을 제공합니다.

+0

물론 규칙을 어기는 것은 언제나 가능하지만, 그들이 잘못한 것을 알고 싶습니다. 왜 컬렉션을 바꾸는 것이 잘못되어야 하는가? 이 태그가 지정되지 않았습니다 ... 내 장바구니에 이미 개인 속성으로 ArrayObject가 있습니다. 컬렉션을 수정하지 못하도록 내 자신의 래퍼를 작성할 것입니다 ... 조언을 주셔서 감사합니다 –

+0

이제 컬렉션의 복제 된 버전을 반환하는 정적 함수를 구현할 수 있습니다. 원본은 동일하게 유지되지만 반환 된 개체는 더 이상 연결되지 않아 변경할 수 있습니다. clone 키워드를 찾으십시오. –

+0

왜이 방법이 정적이어야한다고 생각합니까? 복제 된 컬렉션을 반환하는 경우 컬렉션을 먼저 추출하고 장바구니/항목을 편집 한 다음 컬렉션을 편집하면 컬렉션이 최신 상태가 아닙니다. –