PHP 데이터베이스 작업 대상 지향 장점

Mysql 에서 필요 한 줄(기록)을 가 져 오고 데 이 터 를 읽 은 다음 변경 사항 을 액세스 하 는 방법 을 알 고 있 습 니 다.분명 하고 직접적 이 며 이 과정 뒤에 도 빙빙 돌려 서 말 하 는 것 이 없다.그러나 우리 가 대상 에 대한 프로 그래 밍(OOP)을 사용 하여 데이터베이스 에 있 는 데 이 터 를 관리 할 때 이 과정 은 크게 개선 되 어야 한다.이 글 은 대상 에 직면 하 는 방식 으로 데이터 베 이 스 를 관리 하 는 기록 을 어떻게 설계 하 는 지 에 대해 간단 한 설명 을 할 것 이다.당신 의 데이터 중의 모든 내부 논리 관 계 는 매우 조리 있 는 기록 대상 으로 봉 인 될 것 입 니 다.이 대상 은 전문 적 인 확인 코드 시스템,전환 과 데이터 처 리 를 제공 할 수 있 습 니 다.Zend Engine 2 와 PHP 5 가 발표 되면 서 PHP 개발 자 는 대상 을 상대 로 하 는 더 강력 한 도 구 를 가지 고 보조 작업 을 할 것 입 니 다.이 과정(대상 을 대상 으로 데이터 베 이 스 를 관리 하 는 것)을 더욱 매력 적 으로 만 들 것 입 니 다.데이터 베 이 스 를 사용 하 는 데 유리 한 점 을 다음 과 같이 설명 합 니 다.액세스 방법(Accessor methods)은 속성 에 대한 읽 기와 쓰기 과정 을 모든 단계 의 기록 과 속성(조작)을 완전히 제어 할 수 있 습 니 다.확인 과정 이 관계 표 에서 스마트 하 게 대상 을 얻 고 중복 사용 하 는 논리 적 방법 은 모든 데이터 의 상호작용 이 통 해 야 한 다 는 것 을 의미 합 니 다.같은 기본 코드(codebase)를 사용 하면 유지 보수 가 더욱 간단 해 집 니 다.서로 다른 기록 의 내부 논 리 는 번 거 로 운 라 이브 러 리(lib)파일 이 아 닌 각각 있 는 클래스(class)에 포함 되 어 있 기 때 문 입 니 다.오류 가 발생 했 을 때 접근 방법(Accessor methods)접근 방식 은 클래스 를 통 해 인 스 턴 스(instance)의 변 수 를 할당 합 니 다.예 를 들 어 저 는 User 라 는 클래스 가 있 고 인 스 턴 스$username 이 있 습 니 다.저 는 이러한 액세스 방법(함수),User->username()과 User->setUsername()을 써 서 인 스 턴 스 에 값 을 부여 합 니 다.username; } function setUsername($newUsername) { $this->username = $newUsername; } } ?> 이런'특별한 코드'를 만 들 수 있 는 좋 은 이유 가 있 습 니 다.이것 은 개발 자 들 로 하여 금 클래스 의 번 거 로 운 작업 을 더욱 유연 하 게 바 꾸 게 할 것 이다.왜냐하면 이 과정 은 다른 사용 클래스 의 php 코드 가 필요 하지 않 기 때문이다.보다 완벽 하고 신뢰 할 수 있 는 User 클래스 를 살 펴 보 자.변수$username 은 더 이상 존재 하지 않 습 니 다.모든 것 을 배열 에 통합 합 니 다$data 에서 username 이 비어 있 으 면 username()함수 가 결 성 된 값 을 제공 합 니 다.setUsername()과정 은 값 을 받 아들 이기 전에 username 이 표준 형식(예 를 들 어 글자 길이 등)에 맞 는 지 확인 합 니 다._data['username']) ? $this->_data['username'] : '(no name!)'; } function setUsername($newUsername) { if ($this->validateUsername($newUsername)) { $this->_data['username'] = $newUsername; } } function validateUsername(&$someName) { if (strlen($someName) > 12) { throw new Exception('Your username is too long'); // PHP5 only } return true; } } ?> 이것 은 우리 가 액세스 대상 의 데 이 터 를 제어 하 는 데 큰 도움 이 된다 는 것 을 알 수 있다.만약 프로그래머 가 username 의 정 보 를 직접 액세스 했다 면,상기 코드 의 변 화 는 그의 코드 를 파괴 할 것 이다.그러나 우 리 는 위 코드 에 설명 되 어 있 는 것 처럼 검증 기능 을 추가 할 수 있 습 니 다.다른 것 을 바 꾸 지 않 아 도 됩 니 다.username 의 인증(예 에서 12 바이트 를 초과 할 수 없습니다)코드 는 setUsername()방법 외 에 독립 되 어 있 습 니 다.검증 에서 데이터베이스 에 저장 하 는 과정 은 쉽다.그리고 이것 은 경험 에 만 의존 하 는 아주 좋 은 방법 이다.한 가지 방법 이나 한 가지 유형 이 해 야 할 일이 적 을 수록 중복 사용 할 기회 가 클 것 이다.이것 은 당신 이 키 클래스 를 쓰기 시 작 했 을 때 더욱 뚜렷 합 니 다.만약 에 키 클래스 가 필요 하 다 면 부모 클래스 의 방법(행위)중의 특수 한 디 테 일 을 뛰 어 넘 어야 합 니 다.만약 에(이 디 테 일 에 대한)방법 이 작고 정교 하 다 면(수정)은 한 순간의 과정 일 뿐 입 니 다.만약 에 이 방법 이 매우 비대 하고 여러 가지 목적 을 겨냥 하면...복사 하위 클래스 의 많은 코드 에서 답답 하 게 끝 날 수도 있 습 니 다.예 를 들 어 Admin 이 User 류 의 하위 클래스 라면.저 희 는 adamin 사용자 에 대해 서로 다른,상대 적 으로 까다 로 운 암호 검증 방법 을 가 질 수 있 습 니 다.가장 좋 은 것 은 부모 클래스 를 뛰 어 넘 는 검증 방법 과 전체 setUsername()방법(하위 클래스 에서 다시 쓰기)입 니 다.액세스 기(Accessor)에 대한 더 많은 예 는 액세스 기 를 어떻게 사용 하 는 지 설명 하 는 다른 예 입 니 다.배열 의 정적 데 이 터 를 간단하게 되 돌려 주 는 것 이 아니 라 결 과 를 계산 해 야 할 때 가 많 습 니 다.액세스 방법 이 할 수 있 는 유용 한 일 은 캐 시 에 있 는 값 을 업데이트 하 는 것 입 니 다.모든 변동(데이터 에 대한 모든 조작)이 setX()방법 을 통과 해 야 할 때 이것 은 바로 우리 가 X 에 따라 캐 시 에 있 는 값 을 리 셋 할 때 입 니 다.그래서 우리 의 이러한 차원 은 더욱 명확 해 졌 다.내부 변수$data 의 처리 가 보 호 받 는 개인 적 인 방법 으로 바 뀌 었 습 니 다(private methods)getData()와setData()와 같은 방법 은 기록(Record)이 라 고 불 리 는 추상 적 인 슈퍼 클래스(super class)로 옮 겨 집 니 다.물론 User 클래스 의 하위 클래스 입 니 다.이 기록 클래스(Record class)는 모든 액세스 배열 을 파악 합 니 다$data 의 세부 사항,내용 이 수정 되 기 전에 검증 방법 을 호출 하고 변 경 된 알림 을 기록(Records)에 보 냅 니 다.예 를 들 어 센터 대상 저장(Object Store)인 스 턴 스 와 같 습 니 다._getData('password')); return str_repeat('*', $passLength); } /** * Setting the user password is not affected. */ function setPassword($newPassword) { $this->_setData('password', $newPassword); } /** * fullName is a derived attribute from firstName and lastName * and does not need to be stored as a variable. * It is therefore read-only, and has no 'setFullname()' accessor method. */ function fullName() { return $this->firstName() . " " . $this->lastName(); } /** * Spending limit returns the currency value of the user's spending limit. * This value is stored as an INT in the database, eliminating the need * for more expensive DECIMAL or DOUBLE column types. */ function spendingLimit() { return $this->_getData('spendingLimit') / 100; } /** * The set accessor multiplies the currency value by 100, so it can be stored in the database again * as an INT value. */ function setSpendingLimit($newSpendLimit) { $this->_setData('spendingLimit', $newSpendLimit * 100); } /** * The validateSpendingLimit is not called in this class, but is called automatically by the _setData() method * in the Record superclass, which in turn is called by the setSpendingLimit() method. */ function validateSpendingLimit(&$someLimit) { if (is_numeric($someLimit) AND $someLimit >= 0) { return true; } else { throw new Exception("Spending limit must be a non-negative integer"); //PHP5 only } } } /** * Record is the superclass for all database objects. */ abstract class Record { var $_data = array(); var $_modifiedKeys = array(); // keeps track of which fields have changed since record was created/fetched /** * Returns an element from the $_data associative array. */ function _getData($attributeName) { return $this->_data[$attributeName]; } /** * If the supplied value passes validation, this * sets the value in the $_data associative array. */ function _setData($attributeName, $value) { if ($this->validateAttribute($attributeName, $value)) { if ($value != $this->_data[$attributeName]) { $this->_data[$attributeName] = $value; $this->_modifiedKeys[] = $attributeName; $this->didChange(); } else { // the new value is identical to the current one // no change necessary } } } /** * For an attribute named "foo", this looks for a method named "validateFoo()" * and calls it if it exists. Otherwise this returns true (meaning validation passed). */ function validateAttribute($attributeName, &$value) { $methodName = 'validate' . $attributeName; if (method_exists($this, $methodName)) { return $this->$methodName($value); } else { return true; } } function didChange() { // notify the objectStore that this record changed } } ?> 현재 우 리 는 추상 적 인 슈퍼 클래스(Record)를 가지 고 있 습 니 다.우 리 는 User 클래스 에 있 는 대량의 코드 를 옮 길 수 있 고 이 User 의 하위 클래스 로 하여 금 User 의 특수 항목,예 를 들 어 액세스 와 검증 방법 에 관심 을 가지 게 할 수 있 습 니 다.우리 기록 류(Record class)에 SQL 코드 가 없다 는 것 을 알 고 있 을 수도 있 습 니 다.이것 은 결코 소홀 하거나 누락 된 것 이 아니다!대상 저장 소 클래스(Object Store class)(두 번 째 부분 에 숨 어 있 음)는 데이터베이스 와 의 모든 상호작용 을 책임 지고 우리 의 슈퍼 레코드 의 실례 화 를 책임 집 니 다.이렇게 하면 우리 의 Record 류 를 더욱 작고 효율 적 으로 만 들 수 있 는데 이것 은 우리 가 대량의 대상 을 처리 하 는 효율 을 평가 할 때 중요 한 요소 이다.

좋은 웹페이지 즐겨찾기