te30

PHP の再考 – Stitcher.io

(jp) =

私なら、PHP について 1 つか 2 つ変更します。 もちろん、PHP の開発については何も言う必要はありません。 日常的に使用する言語にどのような変更を加えたいかを発見することは、今でも興味深い思考実験だと思います。ぜひ聞いてみたいと思います。 あなたの考え 同じように。 はっきりさせておきますが、これは非常に主観的なリストであり、コア チームが行っている素晴らしい仕事を批判するものではありません。

PHP は年々成長し、進化しているため、これは私の古い投稿の更新版です。 飛び込みましょう!

# デフォルトでファイナル

オブジェクト指向プログラミングに関する一般的な誤解は、オブジェクト指向プログラミングはすべて継承に関するものだというものです。 継承とポリモーフィズムにはそれぞれの役割がありますが、オブジェクト指向はそれ以上のものです。

これらの原則は、「OO」コードを書いていると主張するプログラマーによって悪用されることが多いため、この言語は、これらの間違いを防ぐのに役立つはずです。

そのため、デフォルトですべてのクラスを final にします。

final class Foo

class Bar extends Foo

さらに一歩進んで、クラスは抽象クラスからの拡張またはインターフェースの実装のみが許可されます。 このようにして、具象クラスの深い継承チェーンを防ぐことができます。

# デフォルトでは無効

考えてみると、void は奇妙なものです。それは「型」であり、型の欠如を示します。 明らかな方法を使用しないのはなぜですか。戻り値の型がないということは、何も返されないことを意味します。

class Foo

    public function bar(): void
    
        
    
class Foo

    public function bar()
    
        return false;
    

関数が 2 つの型を返したい場合、それが次のポイントです。

# いいえ mixed タイプ

mixed タイプは基本的に、「この関数が何を必要とするか、または何を返すかがわからないので、自分で考えてください」という意味です。

このような緩い型システムは、多くのバグの原因となる可能性があります。 同じ関数で 2 つの異なる型を使用する必要がある場合は、2 つの実装を作成する必要があります。これがポリモーフィズムの適所です。 または、インターフェイスにプログラムする必要があります。

いずれにせよ、ある いつも に依存するよりも優れたソリューション mixed. 私のバージョンの PHP では、この言語により、常により適切なソリューションが選択されるようになります。

# すべてのパラメータは入力する必要があります

私のバージョンの PHP では戻り値の型が必要になることは既に確認済みです。 同じことが関数パラメーターにも当てはまることは驚くことではありません。

public function handle($bar)

public function handle(Bar $bar)

# クラス プロパティを入力する必要があります

同じ規則がクラス プロパティにも適用されます。 幸いなことに、PHP 7.4 では型付きプロパティが導入されます。 私はそれらを必須にします。

class Foo

    public $bar;
class Foo

    public Bar $bar;

# 可視性修飾子が必要です

明示性により、混乱の余地がなくなります。 そのため、すべてのメソッドとクラス変数に可視性修飾子が必要です。

class Foo

    function bar()
    
        
    
 
class Foo

    public function bar()
    
        
    
 

# 変数の最終

私はこのリストをやめると言ってこのリストを始めました final キーワード、それはクラスとメソッドにあります。
final クラス変数を「読み取り専用」としてマークするための有効なキーワードになります。

final 変数はコンストラクトで設定でき、後で変更することはできません。

class Foo

    public final Bar $bar;
    
    public __construct(Bar $bar)
    
        $this->bar = $bar;
    
$foo = new Foo($bar);

$foo->bar = new Bar();

# 初期化されていない状態はもうありません

現在、Typed プロパティは構築後に初期化できます。 これは有効な PHP です

class Foo

    public string $bar;
    
    public function __construct() 
        
    


$foo = new Foo();

$foo->bar = 'abc';

プロパティが初期化される前にアクセスされた場合にのみ、PHP はエラーをスローします。

$foo = new Foo();

echo $foo->bar; 

私は、この振る舞いを取り除くと言いたいです。 オブジェクトの作成後に型指定されたプロパティが初期化されていないと、エラーが発生します。

tpyoに気づきましたか? PR を送信して修正することができます。 このブログの最新情報を知りたい場合は、私をフォローしてください。 ツイッター または私のニュースレターを購読してください:

# 名前付きパラメータ

名前付きパラメータはもともとこのリストにありましたが、幸いにも PHP 8 以降では可能です!

# 閉鎖の改善

最初にここに「複数行の短いクロージャー」をリストしましたが、もう少し複雑だと思います。 私が見たいのは、の組み合わせです function/fn=>/{. すべての組み合わせを可能にします:

function a() 
    return ;


function b() => 1;

fn c() 
    return ;


fn d() => 1;

違いは次のとおりです。 function キーワード、外側のスコープへの自動アクセスはありません。つまり、使用する必要があります use クロージャーの外側の変数にアクセスします。 使用する fn にはこの制限がありません。

クロージャーの本体にブラケット表記を使用している場合 、複数行の関数を記述できますが、魔法の return ステートメントはありません。 => 一方、単一の式のみが許可され、すぐに返されます。

# スカラ型もオブジェクト

私たち全員が同意していると私が思う数少ないことの 1 つは、現在の PHP 関数の名前と定義に一貫性がなく、ちょっと厄介なことです。

すべてのスカラー型をオブジェクトとして扱い、それ以外の場合はスタンドアロン関数になるものを含めることができるようにしましょう。

public function handle(): string

    return "a, b, c";


$this->handle()->explode(',');

# 分散の改善

上記の変化の傾向に気づいたかもしれません。 それらのほとんどは、PHP の型システムに関連しています。 それらがすべて追加された場合、現在の型システムをより柔軟にする必要もあります。

幸いなことに、PHP 7.4 では型分散に関する改善が既に導入されています。

class Bar extends Foo   
interface A

    public function handle(Bar $bar): Foo;


class B implements A

    public function handle(Foo $bar): Bar
    
        
    

# 常に厳密な型チェック

厳密な型チェックはデフォルトで行われます。 declare(strict_types=1); もう。

# ジェネリック

型システムをいくつか改善した後、実際にそれを使用するための改善された方法をいくつか追加します。

まず、おそらく PHP の世界のほとんどが待ち望んでいた機能、ジェネリックです。

class List<T>

    public function current(): T
    
        
    

# 列挙型

次は組み込みの列挙型です。 いくつかのユーザーランドの実装に基づいて、コミュニティが組み込みの列挙型から恩恵を受けることは明らかです。

enum Status 

    DRAFT, STATUS, PUBLISHED;
class Bar

    public Status $status;
$bar->status = Status::DRAFT;

PHP 8.1 に列挙型を追加する可能性のある新しい RFC が出現したことは興味深いことです。 まだ議論中なので、具体的なことはまだありません。

# 構造体

このリストを終了するには: structs. 私がいつも使用しているパッケージの 1 つは、データ転送オブジェクト パッケージです。 これにより、厳密に型指定されたオブジェクトを定義できます。 本質的に、それらは構造体が解決することを意図したユーザーランドの実装です。

struct Point 
    int $x;
    int $y;
$point = Point 1, 2

#何を変えたい?

お知らせ下さい PHP ウィッシュリストにあるもの! 最新情報を知りたい場合は、お気軽にニュースレターを購読してください。

次の投稿
木登りができる13の動物
前の投稿
シルバーフィッシュのように見える5つのバグ

ノート:

AZ: 動物の世界、ペット、ペット、野生の自然に関するカテゴリー記事…
SP:スポーツカテゴリー。
New vs Ne: ニュースコラム。
Te: テクノロジー カテゴリ。
Gt:エンターテインメントカテゴリー。
Bt: 占い、星占い、超常現象、超常現象。
Ta:人生コラム。