Laravel 11 の PHP ジェネリック
Laravel を使用した Web アプリケーションビルダーで、静的コード分析に PHPStan を使用している場合、Laravel 11.x.
PHPStan を使用して Laravel を新規インストールすると、初めて ./vendor/bin/phpstan を実行すると、次のエラーがスローされます:
------ ----------------------------------------------------------------------------------- Line app\Models\User.php ------ ----------------------------------------------------------------------------------- 13 Class App\Models\User uses generic trait Illuminate\Database\Eloquent\Factories\HasFactory but does not specify its types: TFactory ------ -----------------------------------------------------------------------------------
PHPDoc が追加されました。すでにご想像のとおり、ジェネリックはフレームワークの多くの部分で使用されています。
/** * @template TFactory of \Illuminate\Database\Eloquent\Factories\Factory */ trait HasFactory { ... }
parameters: ignoreErrors: - identifier: missingType.generics
ジェネリックとは何ですか?
プログラミングにおけるジェネリックとは、複数のデータ型を処理できるコードを作成できるようにする機能を指します。データ型ごとに個別のコードを記述する代わりに、混合型やオブジェクトなどの一般的な型を使用するのとは異なり、型の安全性を維持しながらさまざまな型を操作できる単一の汎用コードを記述することができます。
Laravel 10 の IlluminateDatabaseConcernsBuildsQueries::first メソッドを使用すると、Model のインスタンス、一般オブジェクト、IlluminateDatabaseEloquentBuilder や null などのそれを使用するクラスのインスタンスを返すことができます。
/** * Execute the query and get the first result. * * @param array|string $columns * @return \Illuminate\Database\Eloquent\Model|object|static|null */ public function first($columns = ['*']) { return $this->take(1)->get($columns)->first(); }
ジェネリックは PHP では第一級市民としてサポートされていません。ジェネリックを使用するには、
PHPDocs タグ @template、@template-covariant、@template-contravariant、@extends、@implements、および@use.
ジェネリック型のルールは、型パラメータを使用して定義されます。 PHPDocs では、それらに @template タグの注釈を付けます。既存のクラス名を使用しない限り、型パラメータ名は任意の名前にすることができます。 of キーワードを使用して、type パラメーターの代わりに使用できる型を上限で制限することもできます。これは有界型パラメータと呼ばれます。
<?php namespace Illuminate\Database\Eloquent; /** * @template TModel of \Illuminate\Database\Eloquent\Model * */ class Builder implements BuilderContract { }
汎用関数
ジェネリック関数は通常の関数とまったく同じですが、型パラメーターがあります。これにより、ジェネリック メソッドをより一般的な方法で使用できるようになります。
例として IlluminateSupportValidatedInput::enum メソッドを取り上げます。
- 型パラメータ TEnum を定義します。
- $enumClass パラメータは疑似型クラス文字列であり、同じ型パラメータ TEnum にバインドされています。
- 戻り値の型は TEnum または null のいずれかになります。
------ ----------------------------------------------------------------------------------- Line app\Models\User.php ------ ----------------------------------------------------------------------------------- 13 Class App\Models\User uses generic trait Illuminate\Database\Eloquent\Factories\HasFactory but does not specify its types: TFactory ------ -----------------------------------------------------------------------------------
$request→validated()→enum(‘status‘, OrderStatus::class) を呼び出すと、PHPStan は OrderStatus オブジェクトまたは null を取得していることを認識します!
汎用クラス
ジェネリック クラスを使用すると、型の安全性を確保しながら、任意のデータ型を操作できるクラスを作成できます。これにより、特定の型のプレースホルダーを使用してクラスを定義できるようになり、後でクラスがインスタンス化されるときに置き換えることができます。
Laravel ソース コードの良い例は、IlluminateDatabaseEloquentBuilder クラスです。
/** * @template TFactory of \Illuminate\Database\Eloquent\Factories\Factory */ trait HasFactory { ... }
型パラメーター TModel が定義され、IlluminateDatabaseEloquentModel のサブクラスにバインドされます。同じ型パラメータが make.
メソッドの戻り値の型として使用されます。もう 1 つの例は、ステータスに基づいて注文をフィルターするローカル スコープを持つ注文モデルがある場合です。スコープ メソッドでは TModel タイプを指定する必要があります
parameters: ignoreErrors: - identifier: missingType.generics
ℹ️ info: BelongsTo や HasOne などの名前空間 IlluminateDatabaseEloquentRelations 内のすべての Eloquent リレーション クラスが汎用になりました。
汎用インターフェース
汎用インターフェースはそれほど変わりません。 IlluminateContractsSupportArrayable は汎用インターフェイスの例です
/** * Execute the query and get the first result. * * @param array|string $columns * @return \Illuminate\Database\Eloquent\Model|object|static|null */ public function first($columns = ['*']) { return $this->take(1)->get($columns)->first(); }
インターフェイスは、配列キー型の TKey (int または string にすることができます) と TValue という 2 つの型パラメーターを定義します。これら 2 つのパラメーターは、toArray 関数の戻り値の型を定義するために使用されます。以下に例を示します:
<?php namespace Illuminate\Database\Eloquent; /** * @template TModel of \Illuminate\Database\Eloquent\Model * */ class Builder implements BuilderContract { }
ユーザー クラスは Arrayable インターフェイスを実装し、Tkey タイプを int として指定し、TValue を文字列として指定します。
一般的な特性
この投稿の冒頭のエラーで IlluminateDatabaseEloquentFactoriesHasFactory トレイトに遭遇しました。詳しく見てみましょう:
/** * @template TEnum * * @param string $key * @param class-string<TEnum> $enumClass * @return TEnum|null */ public function enum($key, $enumClass) { if ($this->isNotFilled($key) || ! enum_exists($enumClass) || ! method_exists($enumClass, 'tryFrom')) { return null; } return $enumClass::tryFrom($this->input($key)); }
HasFactory は、IlluminateDatabaseEloquentFactoriesFactory のサブクラスにバインドされた型パラメーター TFactory を定義します。では、そのエラーはどうすれば修正できるのでしょうか?
トレイトを使用する場合は、TFactory タイプを指定する必要があります。したがって、HasFactory トレイトの use ステートメントには、PHPDocs @use:
の注釈を付ける必要があります。
<?php namespace Illuminate\Database\Eloquent; /** * @template TModel of \Illuminate\Database\Eloquent\Model */ class Builder implements BuilderContract { /** * @param array $attributes * @return TModel */ public function make(array $attributes = []) { return $this->newModelInstance($attributes); } }
汎用性の維持
クラスを拡張するとき、インターフェースを実装するとき、またはトレイトを使用するときに、サブクラスの汎用性を維持することができます。
ジェネリック性の維持は、子クラスの上に同じ型パラメータを定義し、それを @extends、@implements、および @use タグに渡すことによって実装されます。
例として IlluminateDatabaseConcernsBuildsQueries 汎用特性を使用します。
型パラメータ TValue を定義します:
------ ----------------------------------------------------------------------------------- Line app\Models\User.php ------ ----------------------------------------------------------------------------------- 13 Class App\Models\User uses generic trait Illuminate\Database\Eloquent\Factories\HasFactory but does not specify its types: TFactory ------ -----------------------------------------------------------------------------------
IlluminateDatabaseEloquentBuilder クラスはこの特性を使用しますが、TModel パラメーター タイプを渡すことで汎用性を維持します。 TModel のタイプ、したがって BuildsQueries トレイトの TValue の指定は、クライアント コードに委ねられるようになりました。
/** * @template TFactory of \Illuminate\Database\Eloquent\Factories\Factory */ trait HasFactory { ... }
最終的な考え
結論として、PHP は他のプログラミング言語と同じようにジェネリックをネイティブにサポートしていませんが、PHPStan のような高度な型ヒントとツールの導入により、開発者はジェネリックのような機能をコードに実装できます。 。 PHPDocs、パラメーター化されたクラス、インターフェイスを活用することで、コードの再利用性と保守性を促進する、より柔軟でタイプセーフなアプリケーションを作成できます。 PHP が進化し続けるにつれて、コミュニティでは型安全性と静的解析に対する注目が高まっており、ジェネリックスを実装するためのより堅牢なソリューションが生まれる可能性があります。これらの実践を取り入れることは、コーディング スキルを向上させるだけでなく、時の試練に耐える高品質のソフトウェアの開発にも貢献します。
以上がLaravel 11 の PHP ジェネリックの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...
