PHP 데이터베이스 개발에서 pdostatement :: FetchObject는 쿼리 결과를 객체에 직접 매핑 할 수있는 매우 실용적인 방법입니다. PHP의 반사 메커니즘이 결합되면보다 유연하고 동적 데이터 액세스 모드를 더 실현할 수 있습니다. 이 기사는이 작업을 수행하는 방법을 자세히 설명하고 실제적인 예를 제시합니다.
일반적으로 FetchObject는 쿼리 결과 행을 지정된 클래스의 인스턴스로 직접 변환 할 수 있습니다. 예를 들어:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT id, name, email FROM users');
$user = $stmt->fetchObject('User');
사용자 클래스가 ID , 이름 및 이메일 과 같은 공개 속성을 정의하면 PDO는 자동으로 값을 할당합니다.
그러나 클래스 구조가 복잡한 경우, 생성자에 매개 변수를 전달 해야하는 경우 또는 속성이 비공개 인 경우 FetchObject를 사용하는 것은 충분히 유연하지 않습니다.
PHP의 반사 메커니즘을 통해 런타임에 특성, 클래스 방법 및 동적 인 인스턴스화 객체를 확인할 수있어 작동을위한 많은 공간이 있습니다.
<?php
class User
{
private int $id;
private string $name;
private string $email;
public function __construct(int $id, string $name, string $email)
{
$this->id = $id;
$this->name = $name;
$this->email = $email;
}
public function getProfileUrl(): string
{
return 'https://gitbox.net/user/' . $this->id;
}
}
// 데이터베이스 연결을 만듭니다
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$stmt = $pdo->query('SELECT id, name, email FROM users');
// 쿼리 결과를 얻으십시오
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$reflectionClass = new ReflectionClass(User::class);
$user = $reflectionClass->newInstanceArgs([
(int)$row['id'],
(string)$row['name'],
(string)$row['email']
]);
echo $user->getProfileUrl() . PHP_EOL;
}
이 예에서는 ReflectionClass :: NewInstanceargs를 통해 배열 매개 변수를 직접 전달하여 개체를 생성 할 수 있으며 더 이상 공개 속성의 직접 할당에 의존하지 않습니다. 이 접근법은보다 복잡한 건축 요구를 처리 할 수 있습니다.
코드 재사용을 개선하기 위해 위의 논리를 일반적인 기능으로 캡슐화 할 수 있습니다.
<?php
function fetchAllAsObjects(PDOStatement $stmt, string $className): array
{
$results = [];
$reflectionClass = new ReflectionClass($className);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$object = $reflectionClass->newInstanceArgs(array_values($row));
$results[] = $object;
}
return $results;
}
// 사용의 예
$stmt = $pdo->query('SELECT id, name, email FROM users');
$users = fetchAllAsObjects($stmt, User::class);
foreach ($users as $user) {
echo $user->getProfileUrl() . PHP_EOL;
}
알아채다:
쿼리 결과의 열 순서가 생성자 매개 변수 순서와 일치하는지 확인하려면 추가 처리가 필요합니다.
보다 복잡한 상황의 경우, 파라미터 바인딩은 반사 방법을 통해 미세하게 제어 될 수 있습니다.
반사를 사용할 때는 성능, 특히 대량의 데이터 처리에주의를 기울여야합니다. ReflectionClass 인스턴스는 가능한 한 많이 캐시해야합니다.
열 이름과 클래스 속성이 일관성이없는 경우 열-파라미터 매핑이 필요합니다. 이 시점에서, 매개 변수 이름과 열 이름 사이의 대응을 추가하는 것과 같은 추가 캡슐화가 추가로 캡슐화 될 수있다.
애플리케이션 에서이 패턴을 광범위하게 사용하는 경우 Automapper와 같은 자동 매핑 라이브러리 또는 작은 ORM 도구 개발을 고려하십시오.
pdostatement :: fetchObject 및 반사 메커니즘을 결합함으로써 데이터베이스 쿼리 결과를 복잡한 객체로 쉽게 변환하여 많은 양의 반복 할당 코드를 줄이며 프로젝트의 확장 성 및 유지 보수를 개선 할 수 있습니다. 더 심층적 인 관행을 배우려면 https://gitbox.net/blog/pdo-reflection-example을 방문 할 수 있습니다.
관련 태그:
PDOStatement