28

アプリケーションの作成で忙しく、PHP 7 の戻り値の型を使用したいと考えています。今私はphp.netでnull、戻り値の型が定義されているときに返すことが許可されていないという設計上の決定であると読みました。

これを処理する正しい方法は何ですか?

1 つのオプションは、try...catch ブロックです。

public function getMyObject() : MyObject
{ 
     return null;
}

try
{
    getMyObject();
}
catch(Exception $e)
{
    //Catch the exception
}

オブジェクトを返すすべてのメソッドに対して try...catch ブロックを記述する必要があるため、私のコードは巨大な try...catch ブロックになるため、これについては良い感じがしません。

Null オブジェクト パターンはこれに対する優れたソリューションですNullObjectが、アプリケーションで for each オブジェクトを作成するという考えは好きではありません。これを行う正しい方法はありますか?

4

6 に答える 6

27

コードがクラスのインスタンス (この場合は ) を返すことを期待しているMyObjectが、そうでない場合、それは実際には例外であり、そのように処理する必要があります。

ただし、この例外は自分でスローする必要があります。

public function getMyObject() : MyObject
{
    throw new MyCustomException("Cannot get my object");
}

次に、その特定の例外をキャッチして、それに応じて続行できます。

于 2015-12-14T13:48:43.887 に答える
6

オブジェクトを返すすべてのメソッドに対して try / catch ブロックを記述する必要があるため、私のコードは巨大な try/catch ブロックになるため、これについては良い感じがしません。

別の方法 (コードを使用) は、返された値を常にチェックして、オブジェクトとしてnull使用してもエラーが発生しないようにすることです。null

例外を使用すると、より表現力が豊かになり、バグを早期に発見できるようになります。これは良いことです。したがって、メソッドが常にオブジェクトを返すようにするか、コントラクトを実行できない場合は例外をスローします。それ以外の場合、戻り値の型には実際の値がありません。

于 2015-12-14T13:44:15.350 に答える
6

Optionデータ型を使用できます。

SomethingまたはNothingラップされた値を持つ型です。

ここでより詳細な説明を見つけることができ、ここで PHP でのオープンな実装の 1 つを見つけることができます。

PS 例外、出力パラメーター、またはそのようなロジックの追加メソッドを使用しないでください。これは、ジョブにとって不適切なツールです。

于 2015-12-14T15:51:27.200 に答える
0

私は同じものを求めるつもりでした。これにはあまり意味がありません。

名前でユーザーを検索する次のサンプル コードがあるとします。

<?php

class User
{
    protected $name;

    /**
     * User constructor.
     *
     * @param $name
     */
    public function __construct(string $name)
    {
        $this->name = $name;
    }

    /**
     * @return mixed
     */
    public function getName() : string
    {
        return $this->name;
    }
}


function findUserByName(string $name, array $users) : User {
    foreach ($users as $user) {
        if ($user->getName() == $name) {
            return $user;
        }
    }

    return null;
}


$users = [
    new User('John'), new User('Daniel')
];

$user = findUserByName('John', $users);

echo $user->getName()."\n";

$user2 = findUserByName('Micheal', $users);

User または null のいずれかを取得できることを Php に伝えたいと思います。ここで、常に try catch ブロックでラップする必要があります。この場合、戻り値の型を宣言する意味はあまりありません。一方、findUserByName関数が複雑になると、完全なユーザー オブジェクトではなくユーザー名などを誤って返す可能性があるため、戻り値の型を定義したいと考えています。

関数の複数の戻り値の型を定義する方がはるかに合理的だと思います。1 つのオブジェクトまたはオブジェクトの配列を返す関数を作成する場合があります。定義すると便利です。この関数は、たとえばUser、またはユーザーの配列を返す必要がありますUser[]

OPの場合(および私の場合)、戻り値の型を as として宣言User, nullすると、問題が解決します。

于 2015-12-14T17:32:16.850 に答える