検索
ホームページバックエンド開発PHPチュートリアルPHP のジェネリックスの簡単な分析と基礎知識の理解

この記事では、PHP のジェネリックについて説明し、ジェネリックに関する基本的な知識を紹介します。

PHP のジェネリックスの簡単な分析と基礎知識の理解

PHP のジェネリックス。これが私が望んでいることだとわかっていました。多くの開発者がこのタイプを使用することを望んでいることはわかっています。一方で、ジェネリックとは何か、またはなぜこの型があるのか​​を知らない PHP プログラマーも多数いるかもしれません。

このブログではジェネリックとPHPに関するシリーズを行う予定です。まずは最初から始めて、すぐにより複雑なトピックに移ります。ジェネリックとは何か、PHP がジェネリックをサポートしない理由、そして将来何が起こるかについて説明します。

始めましょう。

PHP のジェネリックスの簡単な分析と基礎知識の理解

すべてのプログラミング言語には何らかのシステムがあります。一部の言語は実装が非常に厳密ですが、他の言語 (PHP はこのカテゴリに分類されます) ははるかに緩やかです

さて、型システムを使用する理由はたくさんあります。 最も明白なのは、型検証です。

2 つの数値、2 つの整数を受け取り、それらに対して何らかの計算を行う関数があるとします。

function add($a, $b) 
{
    return $a + $b;
}

PHP では、数値、文字列、ブール値など、あらゆる種類のデータを関数に渡すことができます。 PHP は、変数を加算するなど、意味がある場合には変数を変換するために最善を尽くします。

add('1', '2');

しかし、これらの変換 (型のジャグリング) は、予期しない結果、つまりエラーやクラッシュを引き起こすことがよくあります。

add([], true); // ?

これで、数学的加算演算が任意の入力に使用されることを確認するコードを手動で作成できます

function add($a, $b) 
{
    if (!is_int($a) || !is_int($b)) {
        return null;
    }
    return $a + $b;
}

あるいは、PHPS 組み込みの型ヒントを使用することもできます。これは、私たちが行うための組み込みの短縮表現です。操作は手動で:

function add(int $a, int $b): int 
{
    return $a + $b;
}

PHP コミュニティの多くの開発者は、この関数には整数だけを渡すべきであることを知っているため、これらの型ヒントについてはあまり気にしていないと述べています。結局のところ、この関数は自分たちで作成したのです。

しかし、この推論はすぐに破綻します。多くの場合、そのコードベースで作業しているのはあなただけではなく、自分で書いたわけではないコードを使用していることになります。Composer でどれだけのパッケージを取り込むかを考えてみてください。したがって、この個別の例は大したことのようには見えませんが、コードが大きくなり始めると、型チェックが役に立ちます。

さらに、型ヒントを追加すると、無効な状態を防ぐだけでなく、プログラマが必要とする値の入力の種類も明確になります。関数の機能のほとんどはすでにその型定義によってカプセル化されているため、型を定義すると、通常、外部ドキュメントを読む必要がなくなります。

IDE はこの原則を多用します。つまり、関数が期待する値の入力の種類、またはオブジェクトがクラスに属しているため、オブジェクトで使用できるフィールドとメソッドをプログラマに伝えることができます。 IDE を使用すると、コード ベースの型ヒントを静的に分析できるため、コードをより効率的に作成できるようになります。

この言葉を覚えておいてください: 静的​​分析 - これはこのシリーズの後半で非常に重要になります。 これは、プログラム、IDE、または他のタイプの「静的アナライザー」がコードを調べて、実行しなくても動作するかどうかを、少なくともある程度は知らせることができることを意味します。整数のみを受け入れる文字列を関数に渡すと、IDE は何が間違っているのかを教えてくれます。これにより、実行時にプログラムがクラッシュしますが、IDE は実際にコードを実行しなくても教えてくれます。

その一方で、型システムにも限界があります。 一般的な例は「項目のリスト」です。

class Collection extends ArrayObject
{
    public function offsetGet(mixed $key): mixed 
    { /* … */ }
    public function filter(Closure $fn): self 
    { /* … */ }
    public function map(Closure $fn): self 
    { /* … */ }
}

コレクションには、ループ、フィルタリング、マッピングなど、あらゆるタイプの入力を処理するための多くの方法があります。コレクションの実装では、文字列を処理するか整数を処理するかを気にする必要はありません。

しかし、外部の視点から見てみましょう。あるコレクションには文字列のみが含まれ、別のコレクションには「ユーザー」オブジェクトのみが含まれるようにしたい場合はどうなるでしょうか。コレクション自体はその項目をループするときに気にしませんが、私たちは気にします。ループ内の項目がユーザーなのか文字列なのかを知りたいのですが、それはまったく異なります。ただし、正しい型情報がないと、IDE は未知の状況で実行されます。

$users = new Collection();
// …
foreach ($users as $user) {
    $user-> // ?
}

これで、コレクションごとに個別の実装を作成できます。1 つは文字列でのみ機能し、もう 1 つは User オブジェクトでのみ機能します:

class StringCollection extends Collection
{
    public function offsetGet(mixed $key): string 
    { /* … */ }
}
class UserCollection extends Collection
{
    public function offsetGet(mixed $key): User 
    { /* … */ }
}

しかし、3 番目の実装が必要な場合はどうすればよいでしょうか?第4?たぶん10か20。これらのコードの管理は非常に困難になります。

ここでジェネリック医薬品が登場します。

明確にしておきます: PHP にはジェネリックがありません。これはかなりの回り道を伴う大胆な発言ですが、これについてはこのシリーズの後半で説明します。しかし今、私がこれから紹介するものは PHP には存在しないと言えます。 しかし、他のプログラミング言語にも存在します。

多くのプログラミング言語では、開発者が考えられる型ごとに個別の実装を実装するのではなく、コレクション クラスで「ジェネリック」を定義できます。

class Collection<Type> extends ArrayObject
{
    public function offsetGet(mixed $key): Type 
    { /* … */ }
    // …
}

基本上我们说的是集合类的实现适用于任何类型的输入,但是当我们创建集合的实例时,我们应该指定一个类型。它是一个泛型实现,需要根据程序员的需求来特定:

$users = new Collection<User>();

$slugs = new Collection<string>();

添加类型似乎是一件小事。但这种类型本身就开启了一个充满可能性的世界。 我们的 IDE 现在知道了集合中的数据类型,它可以告诉我们是否添加了错误类型的项;它可以告诉我们在迭代集合时可以对项执行什么操作;它可以告诉我们是否将集合传递给知道如何处理这些特定项的函数。

虽然我们可以通过手动为我们需要的每种类型实现一个集合,在技术上实现同样的效果;对于编写和维护代码的开发人员来说,通用实现将是一项重大改进。

那么,我们为什么不在 PHP 中使用泛型呢?除了无聊的收藏,我们还能用它们做什么?我们能为他们增加支持吗?我们将在这个系列中回答所有这些问题。首先需要澄清的是:我在本系列文章中的目标是教你关于泛型的知识,但同样重要的是,我想让大家意识到我们是如何误解 PHP 的。我想改变这种状况。

推荐学习:《PHP视频教程

声明
この記事はlearnkuで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
PHPの抽象クラスまたはインターフェイスに対して、いつ特性を使用しますか?PHPの抽象クラスまたはインターフェイスに対して、いつ特性を使用しますか?Apr 10, 2025 am 09:39 AM

PHPでは、特性は方法が必要な状況に適していますが、継承には適していません。 1)特性により、クラスの多重化方法が複数の継承の複雑さを回避できます。 2)特性を使用する場合、メソッドの競合に注意を払う必要があります。メソッドの競合は、代替およびキーワードとして解決できます。 3)パフォーマンスを最適化し、コードメンテナビリティを改善するために、特性の過剰使用を避け、その単一の責任を維持する必要があります。

依存関係噴射コンテナ(DIC)とは何ですか?また、なぜPHPで使用するのですか?依存関係噴射コンテナ(DIC)とは何ですか?また、なぜPHPで使用するのですか?Apr 10, 2025 am 09:38 AM

依存関係噴射コンテナ(DIC)は、PHPプロジェクトで使用するオブジェクト依存関係を管理および提供するツールです。 DICの主な利点には、次のものが含まれます。1。デカップリング、コンポーネントの独立したもの、およびコードの保守とテストが簡単です。 2。柔軟性、依存関係を交換または変更しやすい。 3.テスト可能性、単体テストのために模擬オブジェクトを注入するのに便利です。

通常のPHPアレイと比較して、SPL SPLFIXEDARRAYとそのパフォーマンス特性を説明してください。通常のPHPアレイと比較して、SPL SPLFIXEDARRAYとそのパフォーマンス特性を説明してください。Apr 10, 2025 am 09:37 AM

SplfixedArrayは、PHPの固定サイズの配列であり、高性能と低いメモリの使用が必要なシナリオに適しています。 1)動的調整によって引き起こされるオーバーヘッドを回避するために、作成時にサイズを指定する必要があります。 2)C言語アレイに基づいて、メモリと高速アクセス速度を直接動作させます。 3)大規模なデータ処理とメモリに敏感な環境に適していますが、サイズが固定されているため、注意して使用する必要があります。

PHPは、ファイルを安全に処理する方法をどのように処理しますか?PHPは、ファイルを安全に処理する方法をどのように処理しますか?Apr 10, 2025 am 09:37 AM

PHPは、$ \ _ファイル変数を介してファイルのアップロードを処理します。セキュリティを確保するための方法には次のものが含まれます。1。アップロードエラー、2。ファイルの種類とサイズを確認する、3。ファイル上書きを防ぐ、4。ファイルを永続的なストレージの場所に移動します。

Null Coulescingオペレーター(??)およびNull Coulescing Assignment Operator(?? =)とは何ですか?Null Coulescingオペレーター(??)およびNull Coulescing Assignment Operator(?? =)とは何ですか?Apr 10, 2025 am 09:33 AM

JavaScriptでは、nullcoalescingoperator(??)およびnullcoalescingsignmentoperator(?? =)を使用できます。 1.??最初の非潜水金または非未定されたオペランドを返します。 2.??これらの演算子は、コードロジックを簡素化し、読みやすさとパフォーマンスを向上させます。

コンテンツセキュリティポリシー(CSP)ヘッダーとは何ですか?なぜ重要なのですか?コンテンツセキュリティポリシー(CSP)ヘッダーとは何ですか?なぜ重要なのですか?Apr 09, 2025 am 12:10 AM

XSS攻撃を防ぎ、リソースのロードを制限し、ウェブサイトのセキュリティを改善できるため、CSPは重要です。 1.CSPはHTTP応答ヘッダーの一部であり、厳格なポリシーを通じて悪意のある行動を制限します。 2。基本的な使用法は、同じ起源からのロードリソースのみを許可することです。 3.高度な使用法は、特定のドメイン名がスクリプトやスタイルをロードできるようにするなど、より微調整された戦略を設定できます。 4。CSPポリシーをデバッグおよび最適化するには、コンテンツセキュリティポリシーレポートのみのヘッダーを使用します。

HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか?HTTPリクエストメソッド(取得、投稿、配置、削除など)とは何ですか?それぞれを使用する必要がありますか?Apr 09, 2025 am 12:09 AM

HTTPリクエストメソッドには、それぞれリソースを取得、送信、更新、削除するために使用されるGET、POST、PUT、および削除が含まれます。 1. GETメソッドは、リソースを取得するために使用され、読み取り操作に適しています。 2. POSTメソッドはデータの送信に使用され、新しいリソースを作成するためによく使用されます。 3. PUTメソッドは、リソースの更新に使用され、完全な更新に適しています。 4.削除メソッドは、リソースの削除に使用され、削除操作に適しています。

HTTPSとは何ですか、なぜWebアプリケーションにとって重要なのですか?HTTPSとは何ですか、なぜWebアプリケーションにとって重要なのですか?Apr 09, 2025 am 12:08 AM

HTTPSは、HTTPに基づいてセキュリティレイヤーを追加するプロトコルであり、主に暗号化されたデータを介してユーザーのプライバシーとデータセキュリティを保護します。その作業原則には、TLSの握手、証明書の確認、暗号化された通信が含まれます。 HTTPSを実装する場合、証明書管理、パフォーマンスへの影響、および混合コンテンツの問題に注意を払う必要があります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 中国語版

SublimeText3 中国語版

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