2012-06-17 10 views
6

私は関数のパラメータとして定数を使用しようとしていますが、この定数の型をチェックすることは可能ですか?私が何をしたいのPHP:関数内の変数としての定数

例:

class ApiError { 
    const INVALID_REQUEST = 200; 
} 

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

使用します。

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

これは、与えられた$ステータスがクラスApiError次の定数であることを確認しshoud。このようなことは可能でしょうか?あなたが特定の値のセットに入力を検証する必要がある時はいつでもお勧めの戦略であるホワイトリストの値、に対してテストするin_array()を使用することができます

+0

状態(ApiError次の$の状態は)私が行う方法」を求めている理由です、私が知っているApiError次のクラスのインスタンスではない一定の値 –

+0

を期待it " – m4recek

答えて

5

:クラスのすべての定数をホワイトリストに

// 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 
} 

、あなたはリフレクションを使用することができますそして他の人が述べたようにApiErrorvia ReflectionClass::getconstants()

$refl = new ReflectionClass('ApiError'); 
$valid_statuses = $refl->constants(); 
10

から定数を取得し、全く一般的な解決策はありません。しかし、あなたは例えば、モデル、非常にきれいな方法でそれを行うには、あなたが(=あらゆる可能な状態)を扱っているすべての「オブジェクト」たい場合:

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(); 
    } 
    // ... 
} 

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

+2

オブジェクト指向ではなく配列指向プログラミングなので、in_array()提案は嫌です。 –

0

私は最高のこのアプローチを好む:

class NoticeType { 
    const INFO = 'neutral'; 
    const WARN = 'alert'; 
    const FAIL = 'critical'; 
    const PASS = 'success'; 
    const LITE = 'brand'; 

    private $_type; 

    function __construct($NOTICE_constant) 
    { 
     if (!preg_match('/neutral|alert|critical|success|brand/', $NOTICE_constant)) 
      throw new \Exception('Invalid parameter for '.__CLASS__.' constructor'); 
     $this->_type = $NOTICE_constant; 
    } 
    function getType() { 
     return $this->_type; 
    } 
    function __toString() { 
     return $this->_type; 
    } 
    static function INFO() { 
     return new NoticeType(self::INFO); 
    } 
    static function WARN() { 
     return new NoticeType(self::WARN); 
    } 
    static function FAIL() { 
     return new NoticeType(self::FAIL); 
    } 
    static function PASS() { 
     return new NoticeType(self::PASS); 
    } 
    static function LITE() { 
     return new NoticeType(self::LITE); 
    } 
} 

使い方は非常に単純であり、あなたが台無しにあなたの方法の外に移動する必要があります:

function test (NoticeType $n) { 
    echo ($n == NoticeType::INFO)."\n"; 
} 

test (NoticeType::INFO()); 
1

他のアプローチはになりますコールを変更します。 constが存在するかどうかをチェックしたい場合、この行は遅すぎるでしょう。 $response->status(ApiError::INVALID_REQUEST);

phpインタープリタはconstも存在しているかどうかをチェックし、致命的なエラーで終了します。 try()を使用してキャッチできません。

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'); 

この解決策にはヒントがないことが悪いです。

+0

定数を保持する必要がある場合は、IMOこれが最良の答えです。 –

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