일일 개발에서, 우리는 종종 Sprintf 함수를 사용하여 고정 된 소수점 이하의 숫자 출력, 출력 컨텐츠 정렬 등과 같은 문자열을 형식으로 사용합니다. 그러나이 포맷 로직을 "자동화"할 수있는 경우, 즉 객체의 메타 정보 (클래스의 속성 및 형식 설명과 같은 자동 포맷)를 통해 코드의 유연성과 유지 가능성을 크게 향상시킵니다.
PHP의 반사 API는 런타임에 클래스, 속성 및 메소드를 분석하는 메커니즘을 제공합니다. Sprintf 의 강력한 형식 기능과 결합하여 클래스 속성의 주석 또는 이름 지정 규칙을 기반으로 객체를 형식화하고 출력 할 수있는 "자동 형식 도구"를 구현할 수 있습니다.
우리는 다음과 같은 효과를 얻고 싶습니다.
$user = new User('Alice', 5, 1234.5678);
echo AutoFormatter::format($user);
출력 결과는 다음과 유사합니다.
Name: Alice | Level: 005 | Balance: $1234.57
여기서 형식은 서식 함수에서 하드 코딩되지 않고 클래스의 정의에 의해 결정됩니다.
PHP 8 속성을 사용하여 클래스의 속성에 서식 지침을 추가합니다.
#[Attribute]
class Format {
public function __construct(public string $format) {}
}
class User {
#[Format('%-10s')] // 왼쪽 정렬,점령10조금
public string $name;
#[Format('%03d')] // 정수,0을 보충하십시오3조금
public int $level;
#[Format('$%.2f')] // 保留两조금小数,달러 표시를 추가하십시오
public float $balance;
public function __construct($name, $level, $balance) {
$this->name = $name;
$this->level = $level;
$this->balance = $balance;
}
}
우리는 반사를 사용하여 속성, 해당 형식을 읽고 형식 형식을 생성합니다.
class AutoFormatter {
public static function format(object $obj): string {
$refClass = new ReflectionClass($obj);
$values = [];
$formats = [];
foreach ($refClass->getProperties() as $prop) {
$prop->setAccessible(true);
$value = $prop->getValue($obj);
$attrs = $prop->getAttributes(Format::class);
if (!empty($attrs)) {
$formatAttr = $attrs[0]->newInstance();
$formats[] = $formatAttr->format;
$values[] = $value;
}
}
$formatString = implode(' | ', $formats);
return sprintf($formatString, ...$values);
}
}
$user = new User('Alice', 5, 1234.5678);
echo AutoFormatter::format($user);
// 산출:Name: Alice | Level: 005 | Balance: $1234.57
웹 인터페이스에 적용하려면 형식화 된 결과를 반환하면됩니다.
header('Content-Type: text/plain');
echo AutoFormatter::format(new User('Bob', 42, 98765.4321));
로깅, 템플릿 렌더링 또는 API 응답에 이러한 형식을 사용할 수도 있습니다. 예를 들어:
file_put_contents('https://gitbox.net/logs/user.log', AutoFormatter::format($user), FILE_APPEND);
PHP의 Sprintf 와 반사를 결합하여 응용 프로그램 코드에서 서식 로직을 추출하여 고도로 분리되고 구성 가능한 자동 형식 기능을 달성 할 수 있습니다. 이것은 코드를 더 우아하게 만들뿐만 아니라 향후 형식 변경에 큰 편의를 제공합니다.
이 방법은 통합 형식 출력이 필요한 로깅, 내보내기 및보고와 같은 시나리오에 특히 적합합니다.