__serialize 및 __unserialize
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 49번째.
객체를 저장하거나 전송하기 위해 문자열로 변환해야 할 때 PHP는 직렬화를 사용합니다. __serialize() 및 __unserialize() 매직 메서드를 사용하면 정확히 어떤 data가 저장되고 어떻게 복원되는지 제어할 수 있습니다.
__serialize() 메서드는 직렬화할 data의 array를 반환하고, __unserialize()는 해당 array를 받아 객체를 다시 구성합니다.
<?php
class Session {
public function __construct(
private string $userId,
private array $data,
private int $createdAt
) {}
public function __serialize(): array {
return [
'userId' => $this->userId,
'data' => $this->data
];
}
public function __unserialize(array $data): void {
$this->userId = $data['userId'];
$this->data = $data['data'];
$this->createdAt = time();
}
public function getCreatedAt(): int {
return $this->createdAt;
}
}
$session = new Session("user123", ["theme" => "dark"], time());
$serialized = serialize($session);
$restored = unserialize($serialized);
echo "Created at: " . $restored->getCreatedAt();
createdAt이 직렬화에서 제외되고 역직렬화될 때 새로운 타임스탬프를 받는다는 점에 주목하세요. 이는 민감한 데이터, 임시 값 또는 데이터베이스 연결처럼 직렬화할 수 없는 리소스를 제외할 때 유용합니다.
이 메서드들은 PHP 7.4에서 이전의 __sleep() 및 __wakeup() 메서드를 대체했으며, property 이름 대신 데이터 배열을 직접 다루는 더 깔끔한 접근 방식을 제공합니다.
챌린지
쉬움__serialize()와 __unserialize()를 사용하여 저장되는 데이터와 복원 방식을 제어하는 방법을 보여 주는 사용자 프로필 캐싱 시스템을 만들어 보겠습니다.
코드를 두 개의 파일로 구성합니다:
UserProfile.php: 캐싱 기능을 갖춘 사용자의 프로필을 나타내는UserProfileclass를 만듭니다. constructor promotion을 사용하여$userId(string),$username(string),$email(string),$accessToken(string)에 대한 private properties를 정의합니다. 프로필이 캐시된 시점을 저장하는 private$cachedAtproperty를 추가합니다(생성자에서 처음에는"not cached"로 설정). class에는 다음이 필요합니다:__serialize():userId,username,email만 포함하는 array를 반환합니다.accessToken은 민감한 정보이므로 절대 직렬화해서는 안 됩니다.cachedAttimestamp는 복원할 때 다시 생성됩니다.__unserialize(): data array에서userId,username,email을 복원합니다.accessToken을"expired"로 설정합니다(token은 유지되어서는 안 되기 때문입니다).getInfo(): 다음 형식의 string을 반환합니다:"[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]"
main.php: UserProfile 파일을 include합니다. 네 개의 입력값, 즉 user ID, username, email, access token을 받습니다. 이러한 값으로UserProfileinstance를 생성합니다. 다음 세 줄을 출력합니다:- 원본 프로필의 정보(serialization 전)
serialize()를 사용하여 프로필을 serialize한 다음,unserialize()를 사용하여 unserialize하여 복원된 프로필을 생성합니다. 복원된 프로필의 정보를 출력합니다."Token preserved: yes"또는"Token preserved: no"를 출력합니다. 복원된 프로필의 token이 원본과 일치하는지에 따라 결정됩니다(token은 복원 시 만료되므로 일치하지 않아야 합니다).
이 패턴은 사용자 데이터를 안전하게 캐싱하는 데 필수적입니다. 프로필 정보는 저장하되 access token과 같은 민감한 자격 증명은 절대 유지하지 않으려고 합니다. 프로필이 캐시에서 복원되면 token은 expired로 표시되어 애플리케이션이 새로운 token을 가져오도록 합니다.
직접 해보기
<?php
require_once 'UserProfile.php';
// 입력 읽기
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));
// TODO: 입력 값으로 UserProfile 인스턴스 생성
// TODO: 원본 프로필의 정보 출력 (직렬화 전)
// TODO: 프로필을 직렬화한 다음 역직렬화하여 복원된 프로필 생성
// TODO: 복원된 프로필의 정보 출력
// TODO: Print "Token preserved: yes" or "Token preserved: no"
// 복원된 프로필의 토큰이 원본과 일치하는지 여부에 따라
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize복습 - 사용자 지정 컬렉션직접 연습해 보세요: 온라인 PHP 컴파일러