데이터베이스 작업에 PHP를 사용할 때 PDOSTATEMENT 클래스는 쿼리 결과를 추출하는 다양한 방법을 제공합니다. 그중에서도 FetchObject ()는 쿼리 결과를 객체에 직접 매핑하는 매우 편리한 방법입니다. 이 기사는 FetchObject () 의 사용과 사용의 차이점, 특정 사용 시나리오 및 성능 차이에 대해 자세히 설명합니다.
fetchObject () 메소드는 결과 세트에서 행을 가져 와서 객체로 반환합니다. 기본적으로 STDCLASS 인스턴스를 반환하지만 쿼리 결과가 특정 유형의 객체가되도록 사용자 정의 클래스 이름으로 전달 될 수도 있습니다.
기본 사용량은 다음과 같습니다.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$stmt = $pdo->query('SELECT id, name FROM users');
// 기본적으로 사용됩니다 stdClass
$user = $stmt->fetchObject();
echo $user->name;
// 사용자 정의 클래스 사용
class User {
public $id;
public $name;
public function greet() {
return "Hello, " . $this->name;
}
}
$stmt->execute(); // 쿼리를 다시 실행하십시오
$user = $stmt->fetchObject('User');
echo $user->greet();
?>
특징 : PHP 내장 빈 개체. 속성은 방법없이 동적으로 추가됩니다.
장점 : 가볍고 최소한의 생성 오버 헤드, 사전 정의가 필요하지 않습니다.
단점 : 데이터 만 저장할 수 있지만 행동 논리를 첨부 할 수는 없습니다.
시나리오에 적합 :
임시 데이터 만 필요합니다.
데이터 개체에는 추가 비즈니스 운영이 필요하지 않습니다.
프레젠테이션 목록 또는 간단한 API 반환과 같은 간단한 쿼리 결과의 빠른 처리.
예:
$user = $stmt->fetchObject();
echo $user->name; // 속성을 직접 읽으십시오
이 데이터를 JSON에 빠르게 패키지하려면 :
echo json_encode($user);
최고의 성능으로 매우 간단하고 직접적입니다.
특징 : 자신의 방법, 마법 방법 (예 : __construct , __get ) 및 속성 유형 제약 조건을 정의 할 수 있습니다.
장점 : 객체는 데이터를 저장 할뿐만 아니라 논리를 캡슐화하며 OOP의 원리 (객체 지향 프로그래밍)와 더 일치합니다.
단점 : 특히 복잡한 생성자 일 때 인스턴스화 할 때 특정 오버 헤드가 있습니다.
시나리오에 적합 :
데이터 객체는 비즈니스 로직에 바인딩되어야합니다.
속성은 균일하게 처리되어야합니다 (예 : 자동 날짜 서식, 암호화 및 암호 해독 필드 등).
코드가 더 관리 가능하고 테스트 가능하기를 바랍니다.
대규모 프로젝트에서 MVC 및 DDD (도메인 구동 설계) 모델을 따르십시오.
예:
class Product {
public $id;
public $name;
public function getDisplayName() {
return strtoupper($this->name);
}
}
$stmt = $pdo->query('SELECT id, name FROM products');
$product = $stmt->fetchObject('Product');
echo $product->getDisplayName();
이것은 데이터를 한눈에 분명하게 만들뿐만 아니라 후속 확장 성을 증가시킵니다.
프로젝트 | 기본 stdClass | 커스텀 클래스 |
---|---|---|
인스턴스화 속도 | 매우 빠른 (내장) | 약간 느리게 (사용자 클래스의 인스턴스화가 필요합니다) |
메모리 사용 | 매우 낮습니다 | 약간 높음 (메소드 정의 포함) |
유연성 | 낮추다 | 높은 |
적절한 데이터 볼륨 | 많은 양의 데이터 | 중소형 배치 데이터 |
일반적으로 말하면, 수천 줄 이상의 대형 데이터 세트를 처리해야하고 객체 동작에 대한 특별한 요구 사항이 없으면 STDClass 사용은 최상의 성능을 갖습니다 .
양식 처리, 도메인 객체 모델링 및 REST API 응답과 같은 비즈니스 로직을 하나씩 처리 하면 사용자 정의 클래스가 더 적합합니다 .
사용자 정의 클래스에 생성자가 있고 생성자에 매개 변수가있는 경우 FetchObject는 문제가 발생합니다. FetchObject는 기본적으로 매개 변수가없는 생성자를 호출하기 때문입니다. 매개 변수를 전달 해야하는 경우 두 번째 매개 변수를 사용할 수 있습니다.
$user = $stmt->fetchObject('User', ['param1', 'param2']);
그러나 매개 변수를 전달할 때 PDO는 속성 할당 전에 생성자를 호출합니다.
기본 클래스 STDCLASS : 빠르고 단순하며 간단한 데이터 읽기 및 성능 우선 시나리오에 적합합니다.
맞춤형 클래스 : 강력하게 확장 가능하며 체계적이고 풍부한 행동 시나리오에 적합하며 중간 및 대규모 프로젝트에 적합합니다.
성능 차이 : STDClass는 더 빠르고 메모리 절약이지만 소규모 응용 프로그램에서는 사용자 정의 클래스의 성능 차이는 일반적으로 무시할 수 있습니다.
선택한 방법은 프로젝트 규모, 비즈니스 복잡성 및 향후 유지 보수 비용 에 따라 다릅니다.
https://api.gitbox.net/user/list 와 같은 가벼운 API 인 경우 stdclass가 충분할 수 있습니다.
전자 상거래 플랫폼의 주문 처리 로직과 같은 대규모 비즈니스 시스템 인 경우 사용자 정의 클래스를 사용하는 것이 더 합리적입니다!