pdostatement :: FetchObject는 PHP에서 PDO를 사용하여 데이터베이스를 작동 할 때 매우 실용적인 방법입니다. 레코드를 객체로 반환하고 각 열의 값을 객체의 속성에 할당 할 수 있습니다. 그러나 데이터베이스 열의 유형이 대상 객체 속성의 예상 유형과 일치하지 않으면 유형 불일치, 암시 적 변환 오류 또는 행동 예외와 같은 일부 혼란스러운 문제가 발생할 수 있습니다.
class User {
public int $id;
public string $name;
public bool $is_active;
}
$stmt = $pdo->query('SELECT id, name, is_active FROM users');
$user = $stmt->fetchObject('User');
사용자 테이블의 is_active 열이 Tinyint (1) 유형이고 사용자 클래스에서 BOOL 유형을 정의한다고 가정합니다. IS_Active 의 값이 1 또는 0 인 경우 자동으로 true 또는 false 로 변환 될 수 있습니다. 그러나 실제로 PHP는 유형 int 의 값을 직접 할당하여 유형의 불일치를 유발하고 엄격한 유형 모드에서 직접 오류를 던지게됩니다.
FetchObject 내부에서 데이터베이스 필드는 __set () 또는 직접 할당을 통해 객체 속성에 매핑됩니다. 유형 변환을 수행하지는 않지만 데이터베이스의 원래 값에 따라 값을 직접 할당합니다. 이것은 다음을 의미합니다.
데이터베이스의 int 값은 PHP int가 됩니다.
바르 차는 줄이 될 것입니다
tinyint (1)는 종종 부울 값에 사용되지만 실제로는 정수 유형입니다.
선언의 유형 프롬프트 (strict_types = 1) 또는 PHP 8.2+가 강화되면 유형 불일치로 인해 런타임 오류가 발생합니다.
안전한 접근 방식은 객체를 얻은 후 각 필드를 적절한 유형으로 수동으로 변환하는 것입니다. 이 방법은 가장 안전하고 가장 읽기 쉬운 것입니다.
$user = $stmt->fetchObject('User');
if ($user !== false) {
$user->id = (int)$user->id;
$user->name = (string)$user->name;
$user->is_active = (bool)$user->is_active;
}
FetchObject는 생성자 매개 변수를 전달합니다. 초기화 된 데이터를 수락하는 생성자를 설계하면 유형 변환을 우아하게 구현할 수 있습니다.
class User {
public function __construct(
public int $id,
public string $name,
public bool $is_active
) {}
}
$stmt = $pdo->query('SELECT id, name, is_active FROM users');
$user = $stmt->fetchObject('User');
그러나 여기서 문제는 다음과 같습니다. 데이터베이스 열 순서가 일치하지 않거나 필드가 정확히 일치하지 않으면 예외가 발생할 수 있습니다.
데이터 볼륨이 크거나 객체 구조가 복잡한 경우, 공장 클래스를 사용하여 변환 로직을 처리하는 것을 고려하십시오.
class UserFactory {
public static function fromDb(stdClass $row): User {
return new User(
(int)$row->id,
(string)$row->name,
(bool)$row->is_active
);
}
}
$stmt = $pdo->query('SELECT id, name, is_active FROM users');
$row = $stmt->fetchObject();
if ($row !== false) {
$user = UserFactory::fromDb($row);
}
이것은 더 많은 코드를 가지고 있지만 구조가 명확하고 논리가 중앙 집중화되어 장치 테스트 및 유지 보수가 쉽습니다.
pdo :: fetch_class |를 사용할 수도 있습니다 pdo :: fetch_props_late 모드이지만 유형 변환 문제에주의를 기울여야합니다. PHP는 내부적으로 유형 추론을하지 않습니다.
$stmt = $pdo->query('SELECT id, name, is_active FROM users');
$stmt->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'User');
$user = $stmt->fetch();
위에서 언급했듯이 코드는 단순화되었지만 여전히 유형의 필수 문제를 해결할 수는 없습니다.
객체 추출을 위해 pdostatement :: fetchObject를 사용할 때는 데이터베이스 필드 유형과 객체 속성 유형 간의 서신에주의를 기울여야합니다. PHP는 지능적인 변환을 자동으로 수행하지 않습니다. 특히 유형 프롬프트를 켜면 개발자가 전환 로직을 명시 적으로 처리해야합니다. 가장 권장되는 방법은 공장 클래스 또는 수동 변환 사용과 같은 데이터 추출 및 객체 구성을 해체하여 코드의 견고성과 유지 관리를 향상시키는 것입니다.
자세한 내용은 https://gitbox.net/pdo/fetchobject-type-conversion을 참조하십시오