PHP 属性は PHP 8.0 で導入されました。このバージョンは、コード宣言にメタデータを追加するための属性の導入など、いくつかの新機能と改善をもたらし、この言語にとって重要なマイルストーンとなりました。
私が初めて属性を扱わなければならなかったのは、Inspector の PHP ライブラリの問題が原因でした。 GitHub で確認してください。ソリューションをさらに深く掘り下げる前に、属性とは何か、およびそれらを PHP コードでどのように使用できるかについて概要を説明します。
属性は、クラス、メソッド、プロパティなどの宣言にメタデータを追加できる強力な機能です。これらのメタデータはプログラムで取得できるため、よりクリーンで、より整理され、効率的なコードの新たな可能性が開かれます。
覚えておいてください、属性は実行時には効果がありません。これらはリフレクション API で利用可能になり、クラス、メソッド、またはプロパティに付加された属性に基づいて実行したいものをアプリケーションに認識させることができます。
PHP には、さまざまな目的に役立ついくつかの組み込み属性が付属しています。注目すべきものをいくつか紹介します:
関数またはメソッドを非推奨としてマークし、将来のバージョンで削除される可能性があるため回避する必要があることを示します。
#[Deprecated("Use newFunction() instead")] function oldFunction() { // Function implementation }
子クラスのメソッドが親クラスのメソッドをオーバーライドすることを目的としていることを確認します。
class Child extends Parent { #[Override] public function defaultMethod() { // Method implementation } }
defaultMethod() が最終的に親クラスでその名前を変更する場合、これはオーバーライドではなくなります。この場合、PHP はオーバーライドになると明示的に宣言しているため、警告を発し、不整合について警告します。
とにかく、優れた IDE を使用すれば、この種の間違いを避けることができます。
コードの特定の部分に対する特定の警告を抑制します。
#[SuppressWarnings("SomeWarning")] function someFunction() { // Function implementation }
次に、カスタム属性クラスを作成しましょう。これは、属性内で特定の動作をカプセル化する場合に役立ちます。
#[Attribute] class CustomAttribute { public string $message; public function __construct(string $message) { $this->message = $message; } }
このカスタム属性をさまざまな要素で使用できます:
class MyClass { #[CustomAttribute("This is a custom attribute")] public $myProperty; #[CustomAttribute("Another custom attribute")] public function myMethod() { // Method implementation } }
実際の例を見てみましょう。 Web アプリケーションを構築していて、文字列の長さを定義するカスタム属性を作成するとします:
#[Attribute(Attribute::TARGET_PROPERTY)] class MaxLength { public int $maxLength; public function __construct(int $maxLength) { $this->maxLength = $maxLength; } }
上記の例では、属性をクラス プロパティにのみ適用する機能を制限しました。これで、User クラスで使用できるようになります:
class User { #[MaxLength(20, message: "Username must be 20 characters or less")] public string $username; // Other properties and methods }
前に述べたように、属性をプロパティに追加しても、実行中には影響がありません。しかし、リフレクションを使用してこの情報を取得し、最終的に何らかのアクションを実行できるようになりました。
Symfony や Laravel などの最もよく使用されている PHP フレームワークは、基本的に「アノテーション」を置き換える属性をすでに採用しています。 Symfony 5.2 以降では、コントローラーを宣言し、属性を使用してルートに接続できます:
public class Arrayable implements \ArrayAccess { … public function offsetExists($offset) { return isset($this->data[$offset]); } … }
PHP 8 以降、ArrayAccess インターフェイスの定義は次のように変更されました:
属性を使用して、オフセット関数の引数のデータ型の宣言を強制しました。 LanguageLevelTypeAware 属性を使用すると、実装が引数のデータ型を提供しない場合、「非推奨警告」が発生します。
ただし、関数の引数でデータ型を宣言すると、引数のデータ型宣言をサポートしていない古いバージョンの PHP との互換性が失われます。
これは将来の変更に対する単なる警告であったため、警告を抑制するために別の組み込み PHP 属性を使用して問題を解決しました。
public class Arrayable implements \ArrayAccess { … #[\ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->data[$offset]); } … }
ReturnTypeWillChange 属性は、言語の将来の変更について知っており、必要な更新をすでに計画していることを PHP に伝えるだけです。
特にこの変更については、PHP 9 で確実に実装される予定です。
コードベースをクリーンで十分に文書化した状態に保ち、属性を慎重に使用することを忘れないでください。これは、拡張性、保守性、効率性が最重要視される SaaS 製品開発において特に重要です。
Inspector は、ソフトウェア開発者向けに特別に設計されたコード実行監視ツールです。サーバー レベルで何もインストールする必要はありません。composer パッケージをインストールするだけで準備完了です。
他の複雑なオールインワン プラットフォームとは異なり、Inspector は非常に簡単で、PHP に優しいです。 Laravel または Symfony パッケージを試すことができます。
効果的な自動化、深い洞察、アラートや通知をメッセージング環境に転送する機能をお探しの場合は、Inspector を無料でお試しください。アカウントを登録してください。
または、Web サイトで詳細をご覧ください: https://inspector.dev
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3