PHP について私が変更したいこと

in Vlog

(jp) =

もしも あなた 後方互換性や重大な変更について心配することなく、PHP に関する何かを変更できます。 それはどうなりますか? 1つか2つ、または10を変更することは確かです。

私はこれらのトピックについて考えるのが好きです。 これらすべてを PHP に追加する必要があると私が信じているからではなく、私たち自身の見解に異議を唱え、言語設計について批判的に考えるのは良いことだからです。

このリストは簡潔で要点を絞ったものにしますが、必要に応じてより詳細なコンテンツへのリンクを常に掲載します。 見てみましょう!

#ジェネリック

まず明らかなもの。 ウィッシュリストを優先度の高い順に並べなければならない場合、ジェネリックは 1 位から 5 位にあり、残りはその後に続きます。

function app(classString<ClassType> $className): ClassType

    

ただし、ジェネリックが PHP に導入されていないことは明らかです。 つまり、実行時にそれらを検証したい限り。 それが実際に私の 2 番目のウィッシュリストの項目です。

# 実行時の型チェックは不要

これは単にジェネリックが原因というわけではありませんが、オプトインで静的に分析されたコンパイラーに切り替えるなど、ランタイムに影響を与えることなく、より多くの優れた機能を使用できるようになるためです。

私は実際に、実行時の型チェックを必要としないという詳細な記事を書きました。 静的分析は信じられないほど強力であり、「実行時にすべてを実行しようとする」ことを取り除くことができれば、PHP の成長に大きな利益をもたらすでしょう。

覚えておいてください: それは私の意見です。同意する必要はありません .

# PHP のスーパーセット

JavaScript の TypeScript のように。 スーパーセット言語を単純な PHP にコンパイルできるとしたら何が可能になるか想像してみてください: 複雑な静的型チェック、PHP のランタイム制約で実装するのが難しすぎる多くのクールな構文、ジェネリック 、…

がある 多くの ここで行うべき注意事項と補足事項。 少し前に、このトピックについて少し vlog を作成し、いくつかの短所について説明しましたが、それでも、いつかこの夢が現実になることを願っています.

# カスケード属性

親クラスから属性を取得する簡単な方法です。

したがって、これを書く代わりに:

$attributes = [];

do 
    $attributes = $reflection->getAttributes(
        name: RouteAttribute::class,
        flags: ReflectionAttribute::IS_INSTANCEOF
    );
    
    $reflection = $reflection->getParentClass();
 while ($attributes === [] && $reflection);

これを行うことができます:

$attributes = $reflection->getAttributes(
    name: RouteAttribute::class,
    flags: ReflectionAttribute::IS_INSTANCEOF 
         | ReflectionAttribute::CASCADE
);

# スカラー オブジェクト

ユーザーランドの実装が利用可能であるため、リストの上位にはありませんが、スカラー オブジェクトに適切な名前を付けられるとよいでしょう。 そう String それ以外の StringHelper (これがLaravelが問題を解決する方法です String は予約語です)。

$string = new String(' hello, world ')->trim()->explode(',');

# パイプ演算子

少し前に RFC がありました: パイプ演算子です。 ただし、現在はしばらく活動を休止しています。 実際、ラリー・ガーフィールドはいつかそれをやりたいと思っていると思いますが、現在の計画がどれほど具体的かはわかりません.

とにかく、パイプ演算子はかっこいいでしょう:

$result = "Hello World"
    |> htmlentities(...)
    |> str_split(...)
    |> array_map(strtoupper(...), $$)
    |> array_filter($$, fn($v) => $v != 'O');

引数のプレースホルダーが $$ 構文。

# 関数名を統一

「それは破壊的な変化です!!!」 最後に、すべての PHP 関数が同じ命名規則に従うようにします。 もういや str_replacestrlen、 むしろ string_replacestring_length.

Rector などのツールを使用してアップグレード プロセスを自動化でき、コードを記述しているときに静的アナライザーが正しい関数名を教えてくれます。 慣れるまでには時間がかかりますが、少なくとも一貫した API が存在するでしょう。

# すべてを厳しくする

あなたが今まで私に怒鳴っていなかったとしても、このセクションを読んだ後、あなたの多くはおそらくそうするでしょう. 私はPHPを全体的にもっと厳密にします。 なんで? コードの明快さが好きだからです。 より厳密な言語は、解釈の余地や舞台裏の魔法の余地が少ないことを意味し、多くの混乱につながる. したがって、次のものが含まれます。

  • デフォルトでファイナル
  • 戻り値のタイプが必要です
  • 戻り値の型を省略すると無効になります
  • すべてを入力する必要があります
  • 可視性修飾子が必要です

これはおそらく決して起こらないでしょう、そしてそれは問題ありません。 いずれにせよ、PHP CS を使用することで、これらのほとんどを実施できます。

# 思い返す

最後に、私は過去にこれと同様のリストを作成しましたが、当時私が望んでいたもののいくつかが今日の PHP で実装されていることを見て、実際に嬉しく思います。

だから、誰が知っている! 結局、このリストのさらに多くのものが PHP で終わるのでしょうか? ジェネリックにさせてください!

PHP について何を変更しますか? 教えて ツイッター または私に電子メールを送ってください!

//platform.twitter.com/widgets.js

関連記事

前の投稿
ケンタッキー州で最も深い湖を発見
次の投稿
犬は調理されたエビを食べることができますか.