2008-09-26 6 views
3

PHP、私たち皆が知っているように、非常に緩やかにタイプされています。この言語では、関数のパラメータやクラス変数の型を指定する必要はありません。これは強力な機能です。PHPで間違った型を使用しないようにするにはどうすればよいですか?

場合によっては、スクリプトのデバッグに苦労することもあります。たとえば、ある種類のオブジェクトを異なる種類のオブジェクトが必要なメソッドに渡すと、渡されたオブジェクトに対して特定の変数/メソッドが存在しないというエラーメッセージが表示されることがあります。これらの状況はほとんど迷惑です。より厄介な問題は、あるオブジェクトを間違ったクラスのオブジェクトで初期化し、後でスクリプトの実行時まで「間違ったオブジェクト」が使用されないようにすることです。この場合、元の引数を渡したときよりもずっと後でエラーが発生します。

私が渡したものには、特定のメソッドや変数がない、または使用するオブジェクトに渡されたスクリプトの実行の後半まで待たなければならないという不満の代わりに、エラーメッセージが表示されます間違ったタイプのオブジェクトを指定した場所で、オブジェクトのタイプが間違っているか互換性がないと不平を言っています。

どのようにこれらの状況をコードで処理しますか?互換性のないタイプをどのように検出しますか?スクリプトに型チェックを導入して、わかりやすいエラーメッセージを得る方法を教えてください。

また、Phpで継承を考慮しながらこれをすべて行う方法はありますか?考えてみましょう:

<?php 
class InterfaceClass 
{ 
#... 
} 

class UsesInterfaceClass 
{ 
    function SetObject(&$obj) 
    { 
     // What do I put here to make sure that $obj either 
     // is of type InterfaceObject or inherits from it  

    } 
} 
?> 

次に、このコードのユーザーが自分の具体的なクラスとインターフェイスを実装:

<?php 

class ConcreteClass extends InterfaceClass 
{ 
} 



?> 

私はConcreteClassインスタンス、および将来のすべて、不明なユーザー定義オブジェクトは、また、許容可能になりたいですSetObjectに。正しいタイプをチェックする際に、これをどのようにして許可しますか?

答えて

11

実際、クラスの場合、PHP(5+)でタイプヒントを提供できます。

これは、予想どおり継承でも正しく動作します。さておき、あなたはまた、配列するパラメータを強制的にタイプヒンティングを使用することができますエランGalperinの応答に加えて...あなたのクラス名に

4

を単語「オブジェクト」を入れていないよう

- ありません特定のクラスのオブジェクトだけです。

<?php 
class MyCoolClass { 
    public function passMeAnArray(array $array = array()) { 
     // do something with the array 
    } 
} 
?> 

あなたは::passMeAnArray()方法はarrayを期待するというヒントを入力することができ参照ならびに方法は、任意のパラメータO/Wと呼ばれている場合にデフォルト値を提供することができるように。

1

@Eran Galperinのレスポンスは、使用しているオブジェクトが正しいタイプであることを保証するための推奨される方法です。

instanceOf演算子は、オブジェクトが複数の型のいずれかであることを確認する場合に役立ちます。

+0

instanceofは便利です。それを虐待しないことを忘れないでください。 –

0

あなたのPHPのerror_reporting ini設定を設定することができます。iniファイルを使用するか、error_reporting関数を使用して実行時に設定してください

1

ヒントについては、複数の回答があります。これは技術的な解決策です。しかし、設計全体が分かりやすく、直感的であることも確認する必要があります。これは型の問題や間違いをより稀にします。

ランタイムにを入力すると、これらのタイプのエラーが発生することに注意してください。コードのテストがあることを確認してください。

1

あなたが記述した場合でも、オブジェクトYにメソッド/属性Xが存在しないことを告げるスクリプトがクラッシュするので、どこから来るのか分かります。

とにかく、プログラマーが間違ったオブジェクトをメソッドに渡すのを防ぐことは、時間がかかりません。ドキュメント化やトレーニングに費やすことができます。

ダックタイピングと慎重な同僚が必要なものです。追加のチェックではなく、より固いアプリになります。

しかし、それは、ビューのPythonistaの点であってもよい...プリミティブ型の

2

あなたもis_ *関数を使用することができます。

public function Add($a, $b) 
{ 
    if (!is_int($a) || !is_int($b)) 
    throw new InvalidArgumentException(); 
    return $a + $b; 
} 
関連する問題