ホームページ >バックエンド開発 >PHPチュートリアル >動的言語における静的型付けの皮肉
この記事は Medium でも読むことができます。
プログラミング言語が時間の経過とともにどのように進化するかを見るのはいつも面白いです。
かつて、私がソフトウェア開発の世界へ足を踏み入れたとき、Python、PHP、JavaScript などの動的言語は、迅速な開発に適した柔軟性と簡潔な構文で高く評価されていました。
しかし、これらの弱く型付けされた言語は進化するにつれて、強く型付けされた言語の機能を組み込んでおり、C や Java に非常に似ています。
厳密な型付け言語では、コード内で変数の型を明示的に定義します。目的は、プログラムを実行する前の開発段階でエラーを捕捉し、これらの変数に割り当てるメモリ サイズに関するヒントをコンパイラに提供することです。
// C++ example: 'y' will be an integer float x = 3.14; int y = x; // y = 3 (ignored the decimal part of the number)
一方、Python、PHP、JavaScript などの動的型付け言語では、変数を作成し、実行時にインタープリターにその型を暗示させることができます。
# In python and PHP: 'y' will take the same type as 'x' x = 3.14 y = x // y = 3.14 (float)
次の例では、動的型付けと静的型付けを使用して同じ関数を宣言します。
Python:
# using the classic syntax: def add(x, y): return x + y # using explicit typing: def add(x: int, y:int) -> int: return x + y
JavaScript / TypeScript:
// using the classic syntax function add(x, y) { return x + y; } // using explicit typing function add(x: number, y: number): number { return x + y; }
PHP:
// using the classic syntax: function add($x, $y) { return $x + $y; } // using explicit typing: function add(int $x, int $y): int { return $x + $y; }
PHP 8.2 (2022 年 12 月リリース) では、スタンドアロン型として null、true、および false のサポートを導入することで、それをさらに推し進めています。
public null $nil = null; public false $false = false;`
この記事をこれらの新機能に対する反対意見として受け取らないでください。厳密に型指定された言語を使用する利点は認めます。ただし、Python で型アノテーションを使用しても、変数の型を変更できなくなるわけではありません。
x: int = 0 x = "John" print(type(x)) # <class 'str'>
PHP の場合も同様で、コンソールには非推奨の警告のみが表示されます。
では、なぜインタプリタがこのコードの実行を許可するのか疑問に思われるかもしれません。
それは、これらの言語がそのように構築されているためです。言語は定義により動的に型付けされます。 この特性を削除すると、言語は動的ではなくなります。 C のような厳密に型指定された言語になりますが、速度は遅くなります。
PHP ファイルで strict_types を true に設定することで、インタープリタをより厳密にすることができれば幸いです。
declare(strict_types=1);
Python を使用している間、「mypy」パッケージを使用してコードを分析し、バグを捕捉できます。
// C++ example: 'y' will be an integer float x = 3.14; int y = x; // y = 3 (ignored the decimal part of the number)
「mypy」は、何が間違っていたかをアドバイスするアドバイザーとして表示されますが、危険を冒してコードを実行することを妨げるものではありません。
変数の型が不明な場合でも、union 演算子を使用して、受け入れられる型のリストを減らすことができます。
次の PHP と Python の例は、その方法を示しています。
# In python and PHP: 'y' will take the same type as 'x' x = 3.14 y = x // y = 3.14 (float)
10 年前、私は博士号取得のために Python を使用することに決めました。その理由は、そのシンプルさと新しいアイデアのプロトタイプをすぐに作成できるからです。その後、他のプロジェクトにもそれを使い始めました。
今、私は奇妙な PEP を読んで、これらの新機能を組み込んでコードベースを複雑にすることに本当に価値があるのかと自問していることに気づきました。
辞書の項目を出力する関数の例を見てみましょう。初期バージョンは次のとおりです:
# using the classic syntax: def add(x, y): return x + y # using explicit typing: def add(x: int, y:int) -> int: return x + y
Python 3.12 で導入された PEP 692 の推奨事項を使用すると、コードは次のようになります。
// using the classic syntax function add(x, y) { return x + y; } // using explicit typing function add(x: number, y: number): number { return x + y; }
要約すると、TypedDict を継承するクラスを作成し、各項目の名前と型を指定し、Unpack オペレーターを使用して、受け取ったオブジェクトが TypedDict であることを「mypy」に伝えました。
その結果、コードのサイズが 2 倍になりました。オブジェクトにさらに多くの項目がある場合、時間はさらに長くなります。
幸いなことに、コードの一部に静的型付けを使用し、残りを動的のままにすることができます。あるいは、希望に応じて、まったく使用しないことも選択できます。
新しい素晴らしい機能を学んだからといって、コードベース全体を書き直さなければならないというプレッシャーを感じる必要はありません。
これらの新機能はツールのようなものです。私のアドバイスは、これらを賢く使用することです:
次のシナリオでは静的型付けを使用します:
次の場合は静的型指定の使用を避けてください。
コーディングに関しては、物事を複雑にする正当な理由がある場合を除き、常にシンプルさを追求することが黄金律であることに留意してください。
以上が動的言語における静的型付けの皮肉の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。