2010-06-09 5 views
1

나는 내 데이터베이스에 대한 내 자신의 클래스 모델을 개발 중이고 여러분이 생각하는 것을 알고 싶습니다.PHP 데이터베이스 클래스 패턴 질문/제안

데이터베이스의 각 테이블에 대해 2 개의 클래스가 있습니다. 첫 번째는 페칭 클래스 (나는 그것을 호출하는 법을 모르겠다.)이다.이 클래스는 데이터베이스 (fetchAll, fetchById 등)와 상호 작용하는 정적 메서드를 가지고있다. 두 번째 클래스는 모델 자체이며, 테이블의 행에 대한 모든 메소드 (행에 대한 삽입, 업데이트, 삭제, 유효성 검사 또는 기타 처리)를 포함합니다.

각 가져 오기 클래스는 fetchAll 인 경우 모델 개체를 반환하고 메서드는 모델 배열을 반환하고 fetchById 메서드가 id가 유일한 개체이므로 하나의 개체 만 반환합니다. 내가 사용하는 것이 방법

예 : _Map 이외의 어떤 제안이있는 경우

$users = Users_Map::fetchAll(); 

foreach($users as $user) 
{ 
    echo $user->username.'<br/>'; 
} 

$user = new User_Model(); 
$user->username = 'example'; 
$user->insert(); 

$user = User_Map::fetchById(1); 
$user->username = 'example2'; 
$user->update(); 

, 나는 열려있어. 이 "패턴"이 좋은지, 어떻게 생각하는지 알고 싶습니다. 어떻게 개선 할 수 있습니까? _Model에 정적 및 비 정적 메서드가 모두있는 클래스를 하나만 사용해야합니까?

도움/의견을 보내 주셔서 감사합니다.

답변

1

당신이 진지하게 테스트를 시작했을 때, 당신이 묘사 한 것과 합리적인 것으로 들립니다.

나는 보통 세 가지 클래스의 핵심 구축

:

  1. 데이터베이스 핸들러
  2. 일반 객체 처리기
  3. 일반적인 수집 핸들러는 각 테이블을 대상으로 한 파생됩니다 테이블에서 하나의 행을 나타내는 클래스 및 테이블의 일부 또는 전체를 나타내는 콜렉션에서 파생 된 클래스로 요청시 개별 객체를 반환합니다. 또한 각 클래스에 대해 필요한 모든 정보 (테이블 이름, 유효한 필드 등)를 설정하는 정적 "등록"기능이 있습니다.

    때때로 컬렉션 클래스도 다른 테이블의 개체입니다. 오래 전에 작성한 일반적인 객체와 등록 메커니즘이이 문제를 완벽하게 처리합니다.

+0

컬렉션 클래스를 반복하는 방법은 무엇입니까? 배열을 사용하는 것은 길었습니다. 가볍기 때문에 다시 돌아가서 컬렉션을 뒤져 보는 방법이 필요 없습니다. –

+0

나는 생성기를 만들었습니다. 반복은'while ($ item = & $ collection-> next()) {...}'로 수행됩니다.이렇게하면 루프가 전체 컬렉션을 처리하지 못하게됩니다. 또한 컬렉션은 필요에 따라 각 개체를 검색하기 위해 코딩됩니다. 이 두 가지 특성은 PHP에서 많은 양의 데이터 배열로 이동하는 공통 (메모리) 문제를 방지하는 데 도움이됩니다. 이 기술을 사용하여 성능 문제를 본 적이 없습니다. 대신에 나는 큰 메모리 사용상의 이점을 보았다. – staticsan

+0

안녕하세요,이 샘플 코드는 있습니까? 당신의 아이디어가 여러 가지면에서 저를 도울 수 있습니다. – nuttynibbles

1

간단히 말해서 가져 오기 스타일 메서드를 형식 메서드와 같은 클래스에 결합했지만 이것이 내 많은 응용 프로그램에서 사용하는 모델입니다. PHP 5.3에서 후기 바인딩 정적 멤버를 사용하는 것이 특히 쉽기 때문에 수퍼 클래스 정의 fetchById 맵은 하위 클래스 정의 table_name 변수 (예 :)에 액세스 할 수 있습니다.

+0

그래, 나는 또한 모든 클래스를 하나의 클래스에 넣을 것을 고려 중이다 ... static 및 static .. 인스턴스 = 1 행 .. 정적 메소드 = 페치 –

+0

@ valli-R IS-A 및 HAS-A의 개념. 객체 모델이 데이터베이스 핸들러에서 파생 된 것을 보았습니다. 데이터베이스 핸들러는 핸들러가 아니라 데이터베이스 핸들러가 IS-A 핸들러라고 할 수 없으므로 의미가 없습니다. 유지 보수를 방해합니다. – staticsan