この記事では、PHP のジェネリックスについて詳しく理解し、2 つの一般的な例を紹介します。お役に立てば幸いです。
詳細なジェネリックス
前の記事で非常に退屈なジェネリックスを示しました。例として、これはもっとうまくいくだろう。
$users = new Collection<User>(); $slugs = new Collection<string>();
コレクション
これらはおそらくジェネリックを説明する最も簡単な方法ですが、ジェネリックについて議論するときに誰もが話題にする例でもあります。人々は、「ジェネリック」と「型付きコレクション」を同じものとして考えることがよくあります。絶対にそうではありません。
それでは、さらに 2 つの例を見てみましょう。
これは「app」と呼ばれる関数です。Laravel などのフレームワークを使用している場合は、見覚えがあるかもしれません。この関数はクラス名を受け取り、依存するコンテナーを使用してそのクラスのインスタンスを解決します:
function app(string $className): mixed { return Container::get($className); }
さて、コンテナがどのように機能するかを知る必要はありません。重要なことは、この関数が要求したクラスのインスタンスを提供するということです。
つまり、これは基本的にジェネリック関数であり、戻り値の型は指定したクラス名によって異なります。この関数に「UserRepository」というクラス名を付けた場合、UserRepository のインスタンスだけが返され、それ以外は何も返されないことを IDE や他の静的アナライザーも理解できれば素晴らしいでしょう。これを行う。
私は、このように秘密にしていたことを話す良い機会だと思いました: 前回の投稿で、PHP にはジェネリックが存在しないと述べましたが、それは完全に真実ではありません。世に出ているすべての静的アナライザー - コードを実行せずに読み取るツール、IDE などのツール - ジェネリックスに doc ブロックのコメントを使用できるようにします:
function app(string $className): mixed { /* … */ } app(UserRepository::class); // ?
確かに、これは最も完璧な構文ではなく、すべて静的です。アナライザーは単純なプロトコルに依存しているため、公式の正規構文はありませんが、機能します。 PHP の世界で最大の 3 つの静的アナライザー、PhpStorm、Psalm、および PhpStan はすべて、この構文をある程度理解しています。
PhpStorm などの IDE は、コードを作成するプログラマにフィードバックを提供するためにこれを使用し、Psalm や PhpStan などのツールは、コード ベースを一括分析し、潜在的なバグを検出するためにこれを使用します (主に型定義に基づいています)。
つまり、実際には、この
app 関数を構築して、ツールが暗闇の中で実行されないようにすることができます。もちろん、PHP は実行時に関数の型チェックをしないため、PHP 自体は戻り値の型が正しいことを保証できませんが、静的アナライザーが正しいと信頼できる場合は、実行時にこの段落のコードはほとんどありません。 - 中断される可能性はありません。 これが静的分析の驚異的な力です。コードを実行しなくても、コードのほとんどが期待どおりに動作することを実際に確認できます。これはすべて、ジェネリックを含む型のおかげで可能になります。
より複雑な例を見てみましょう:
/** * @template Type * @param class-string<Type> $className * @return Type */ function app(string $className): mixed { /* … */ }
ここには、プロパティを「クエリ」し、その場でインスタンス化できるクラスがあります。リフレクション API が非常に冗長であることを知る前にプロパティを使用したことがある場合、このヘルパー クラスは非常に便利だと思います。
filter メソッドを使用する場合、プロパティのクラス名を指定し、結果がインスタンスになることを認識して newInstance
メソッドを呼び出します。フィルタクラスの .繰り返しになりますが、IDE が私たちが話していることを理解できれば素晴らしいと思います。 おわかりでしょう: ジェネリックを使用すると、次のことが可能になります:
Attributes::in(MyController::class) ->filter(RouteAttribute::class) ->newInstance() ->
単純な型情報の威力がわかっていただければ幸いです。数年前、これらの分析情報を機能させるには IDE プラグインが必要でしたが、今では型情報を追加するだけで済みます。
ただし、この最新の例はジェネリックに依存しているだけではなく、別の同様に重要な部分が関与しています。型推論: ユーザーが指定しなくても型を「推測」する (つまり確実に決定する) 静的アナライザーの機能。それが、文字列のような注釈で起こっていることです。私たちの IDE は、この関数に提供した入力をクラス名として認識し、型をジェネリック型として推論できます。
これで、すべて解決です。PHP にはジェネリックがあり、すべての主要な静的アナライザーはその使用方法を知っています。そうですね...注意点がいくつかあります。
まず第一に、ジェネリックがどのようなものであるべきかについての公式仕様はありません。現在、各静的アナライザーは独自の構文を使用できます。現時点では、それらのうちの 1 つにたまたま合意していますが、将来はほとんど保証されていません。 。
第二に、私の意見では、ドキュメント ブロックは最適とは言えません。私たちのコードベースでは、それらはそれほど重要ではないと感じます。もちろん、汎用アノテーションは静的な洞察のみを提供し、実行時機能は提供しませんが、実行時の型チェックがなくても静的分析の威力が確認できました。型情報を「ドキュメントのコメント」と考えるのは不公平だと思います。コードにおけるこれらの型の重要性が伝わりません。それが、PHP8 で属性を導入した理由です。属性によって提供されるすべての機能は、docblock コメントで可能でしたが、それだけでは十分ではないと感じました。ジェネリック医薬品も同様です。
最後の注意: 適切な仕様がなければ、3 つの主要な静的アナライザーはすべて、汎用実装間で差異が生じます。現時点で最も不足しているのは PhpStorm です。理想的には、PHP 内から正式な仕様が存在することです。しかし、まだ正式なものはありません。
これらが、より長く持続する、より持続可能なソリューションに時間を投資する価値があると私が考える主な理由です。では、なぜ PHP にはまだ適切なジェネリックがないのでしょうか?なぜ明確な仕様のないドキュメントの塊に依存するのでしょうか?
元のアドレス: https://stitcher.io/blog/generics-in-php-2
翻訳アドレス: https://learnku.com/php/t/ 66484
推奨: 「PHP ビデオ チュートリアル 」
以上がPHP のジェネリックについて例を挙げて詳しく学びますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

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

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

ホットトピック



