PHP 8에 도입 된 PHP 속성은 클래스, 메소드, 기능, 매개 변수 및 속성에 메타 데이터를 추가하는 선언적 방법을 제공합니다. 이전에 메타 데이터를 제공하는 표준 방법 인 PHPDOC 주석 대신 사용할 수 있습니다. 사용 방법은 다음과 같습니다.
사용자 정의 속성을 정의하려면 #[Attribute]
속성으로 클래스를 생성하고 적용 할 수있는 위치를 지정합니다 (예 : TARGET_CLASS
, TARGET_METHOD
).
<code class="php">#[Attribute(Attribute::TARGET_CLASS)] class MyAttribute { public function __construct(public string $value) {} } #[MyAttribute('example')] class MyClass { // Class implementation }</code>
반사를 사용하여 런타임에 속성을 검색 할 수 있습니다.
<code class="php">$reflectionClass = new ReflectionClass(MyClass::class); $attributes = $reflectionClass->getAttributes(MyAttribute::class); foreach ($attributes as $attribute) { $instance = $attribute->newInstance(); echo $instance->value; // Outputs: example }</code>
PHP 속성은 여러 가지 방법으로 코드 가독성 및 유지 관리를 향상시킵니다.
속성은 PHPDOC 주석에 비해보다 체계적이고 읽기 쉬운 구문을 제공합니다. 이들은 PHP 언어 자체의 일부이므로 개발자가 주석을 구문 분석하지 않고도 클래스 또는 메소드에 적용되는 메타 데이터를 쉽게 이해할 수 있습니다.
<code class="php">// Less readable PHPDoc comment /** * @Route("/example") */ class MyClass {} // More readable attribute #[Route('/example')] class MyClass {}</code>
속성은 클래스이기 때문에 현대 IDE의 유형 확인 및 자동 완성의 혜택을받습니다. 이것은 오류를 줄이고 개발 효율성을 향상시킵니다.
속성을 사용하면 메타 데이터를 한 곳 (클래스 정의)으로 정의 할 수 있으므로 유지 관리 및 수정이 쉽습니다. 이 중앙 집중화는 불일치의 가능성을 줄이고 코드베이스를 더욱 관리 할 수있게합니다.
많은 최신 PHP 프레임 워크 및 라이브러리는 응용 프로그램 개발 및 구성을 간소화하는 라우팅, 검증, 직렬화 등의 속성을 활용할 수 있습니다.
PHP 속성은 다양한 실제 시나리오에서 사용할 수 있습니다.
Laravel 또는 Symfony와 같은 프레임 워크에서 속성을 사용하여 컨트롤러 방법에서 경로를 직접 정의하여 라우팅 구성의 선명도와 유지 가능성을 향상시킬 수 있습니다.
<code class="php">use Symfony\Component\Routing\Annotation\Route; class BlogController { #[Route('/blog/{slug}', name: 'blog_show')] public function show(string $slug): Response { // Implementation } }</code>
속성은 속성에 대한 검증 규칙을 직접 정의하여 데이터 무결성을 보장하는 프로세스를 단순화 할 수 있습니다.
<code class="php">use Symfony\Component\Validator\Constraints as Assert; class User { #[Assert\NotBlank] #[Assert\Email] public $email; }</code>
API에서 속성은 객체가 JSON 또는 다른 형식으로 직렬화되는 방식을 제어 할 수 있습니다.
<code class="php">use JMS\Serializer\Annotation as Serializer; class Product { #[Serializer\SerializedName('product_id')] public $id; #[Serializer\Exclude] public $internalData; }</code>
속성을 사용하여 로깅 동작을 정의하는 데 사용될 수 있으며, 예 : 어떤 메소드를 기록 해야하는지 및 어떤 레벨에서
<code class="php">use App\Logging\Annotation\Loggable; class UserService { #[Loggable(level: 'info')] public function createUser(User $user): void { // Implementation } }</code>
예, PHP 속성을 사용하여 종속성 주입, 특히 속성 기반 구성을 지원하는 최신 프레임 워크에서 구현할 수 있습니다. 수행 할 수있는 방법은 다음과 같습니다.
먼저, 주입에 대한 매개 변수를 표시하는 데 사용될 속성 클래스를 정의하십시오.
<code class="php">#[Attribute(Attribute::TARGET_PARAMETER)] class Inject { public function __construct(public string $service) {} }</code>
그런 다음 생성자 매개 변수 또는 메소드 매개 변수의 속성을 사용하여 주입 해야하는 서비스를 나타냅니다.
<code class="php">class UserService { private $logger; public function __construct( #[Inject('LoggerInterface')] LoggerInterface $logger ) { $this->logger = $logger; } public function createUser(User $user): void { $this->logger->info('Creating user'); // Implementation } }</code>
마지막으로, 이러한 속성을 처리하고 올바른 서비스를 주입 할 수있는 종속성 분사 컨테이너가 필요합니다. 컨테이너의 작동 방식에 대한 단순화 된 예는 다음과 같습니다.
<code class="php">class Container { public function get($className) { $reflectionClass = new ReflectionClass($className); $constructor = $reflectionClass->getConstructor(); if (!$constructor) { return new $className; } $parameters = $constructor->getParameters(); $dependencies = []; foreach ($parameters as $parameter) { $attribute = $parameter->getAttributes(Inject::class)[0] ?? null; if ($attribute) { $injectAttribute = $attribute->newInstance(); $dependencies[] = $this->get($injectAttribute->service); } else { $dependencies[] = $this->get($parameter->getType()->getName()); } } return $reflectionClass->newInstanceArgs($dependencies); } }</code>
이 예에서 Container
클래스는 반사를 사용하여 생성자 매개 변수 및 해당 속성을 검사합니다. Inject
속성이 발견되면 지정된 서비스를 해결하고 새 인스턴스에 주입합니다.
의존성 주입 속성을 사용하면 컨테이너가 종속성의 배선을 처리 할 수 있도록 코드를 깨끗하게 유지하고 비즈니스 로직에 집중할 수 있습니다. 이 접근법은 애플리케이션의 가독성과 유지 관리를 향상시킵니다.
위 내용은 PHP 속성 (주석) : 사용 및 예제.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!