8

関数パラメータとして定数を使おうとしていますが、この定数の種類を確認することはできますか?

私が欲しいものの例:

class ApiError {
  const INVALID_REQUEST = 200;
}

class Response {
  public function status(ApiError $status) {
    //function code here
  }
}

使用する:

$response = new Response();
$response->status(ApiError::INVALID_REQUEST);

これは、与えられた$statusがクラスApiErrorの定数であることを確認する必要があります。このようなことは可能ですか?

4

5 に答える 5

11

他の人が述べたように、一般的な解決策はありません。しかし、非常にクリーンな方法でそれを行いたい場合は、扱っているすべての「オブジェクト」(= 可能なすべてのステータス) をモデル化します。たとえば、次のようになります。

interface ApiError {   // make it an abstract class if you need to add logic
    public function getCode();
}

class InvalidRequestApiError implements ApiError {
    public function getCode() {
        return 200;
    }
}

// Usage:
$response = new Response();
$response->status( new InvalidRequestApiError() );

class Response {
    public function status(ApiError $status) {
        echo "API status: " . $status->getCode();
    }
    // ...
}

これにより、単純な数値をカプセル化するだけでなく、タイプヒントを使用できるため、多くのクラスが残ります。

于 2012-06-17T21:35:09.670 に答える
5

in_array()ホワイトリストに登録された値に対してテストするために使用できます。これは、特定の値セットへの入力を検証する必要がある場合に推奨される戦略です。

// Test if it is in an array of valid status constants...
$valid_statuses = array(
   ApiError::INVALID_REQUEST, 
   ApiError::INVALID_SOMETHINGELSE, 
   ApiError::STATUS_OK
);
if (in_array($status, $valid_statuses)) {
   // it's an acceptable value
}

クラスのすべての定数をホワイトリストに登録するには、リフレクションを使用して、ApiError 経由で定数を取得できます。ReflectionClass::getconstants()

$refl = new ReflectionClass('ApiError');
$valid_statuses = $refl->constants();
于 2012-06-17T21:11:57.633 に答える
2

別のアプローチは、呼び出しを変更することです。const が存在するかどうかを確認したい場合、この行では遅すぎます。 $response->status(ApiError::INVALID_REQUEST);

PHP インタープリターも const の存在をチェックし、Fatal Error で終了します。これは、try() を使用してキャッチできません。

したがって、文字列をパラメーターとして使用して、 defined()およびconstant( )を使用して存在を確認することをお勧めします

class ApiError {
  const INVALID_REQUEST = 200;
}

class Response {
  public function status($status) {
    if (!defined('ApiError::'.$status)) {
      return false; // Or throw Exception / other error handling
    }

    $errorCode = constant('ApiError::'.$status);

    //function code here
    return true;
  }
}

使用法は次のようになります。

$response = new Response();
$response->status('INVALID_REQUEST');

悪いことに、このソリューションには型ヒントがありません。

于 2015-03-13T12:02:51.020 に答える
0

SplEnumが役立ちます。PHP ドキュメントの例:

class Month extends SplEnum {
    const __default = self::January;

    const January = 1;
    const February = 2;
    const March = 3;
    const April = 4;
    const May = 5;
    const June = 6;
    const July = 7;
    const August = 8;
    const September = 9;
    const October = 10;
    const November = 11;
    const December = 12;
}

echo new Month(Month::June) . PHP_EOL;

try {
    new Month(13);
} catch (UnexpectedValueException $uve) {
    echo $uve->getMessage() . PHP_EOL;
}

出力:

6
Value not a const in enum Month 
于 2015-11-06T04:32:16.433 に答える