2010-11-18 5 views
3

私はaddメソッドを持つクラス 'Collection'を持っています。 addメソッドはオブジェクトのみを受け入れるべきです。だから、これは望ましい動作です:PHPマニュアルによると

$x=5;//arbitrary non-object 
$obj=new Foo; //arbitrary object 

$collection=new Collection; 
$collection->add($obj); //should be acceptable arg, no matter the actual class 
$collection->add($x); //should throw an error because $x is not an object 

、一つはクラス名と$argを巻頭でメソッドをtypehintすることができます。

public function add(stdClass $obj); 

しかし、それは「引数があるstdClassのインスタンスでなければなりません」で失敗します。すべてのPHPクラスは stdClassの子であるので、私は、このメソッドのシグネチャが働くと考えました。

私は私で定義された親クラスに署名を変更すると、それは動作します:

class Collection { 
    public function add(Base $obj){ 
    //do stuff 
    } 
} 

$collection->add($foo); //$foo is class Foo which is an extension of Base 

は、一般的なオブジェクトのためのヒントを入力する方法を誰もが知っていますか?

+0

'assert(is_object($ arg));'は必要なものだけです。 – mario

答えて

5

JavaのObjectクラスと異なり、にはオブジェクトの基本クラスがありません。オブジェクトはstdClassを継承しません。基本クラスではなく、デフォルトのオブジェクト実装です。だから残念ながら、PHPのすべてのオブジェクトに対してヒントを入力することはできません。

class MyClass { 
    public function myFunc($object) { 
     if (!is_object($object)) 
      throw new InvalidArgumentException(__CLASS__.'::'.__METHOD__.' expects parameter 1 to be object"); 
    } 
} 

幸いにも、PHPはすでにその目的のためにInvalidArgumentExceptionクラスを定義しています。あなたのような何かをしなければなりません。

+1

+1は 'InvalidArgumentException'です。ちょうどメモ、SPLがロードされている場合のみ利用可能です。 – BoltClock

+1

例外文字列に 'MyClass :: myFunc'の代わりに' __METHOD__'を書くこともできます。 – BoltClock

+0

真。幸いにも、SPLは5.0.0からデフォルトでロードされます。私は誰かがそれを無効にする理由を見ることができません、それはとても有用です。 – netcoder

0

PHPはまだ動的言語であり、タイプヒントはそれだけです:ヒント。私はあなたが古いis_objectまたは同様の方法に戻ってカスタム例外をスローする必要があると思います。

class Collection { 
    public function add(Base $obj){ 
    if(!is_object($obj)) 
    throw new Exception("Parameter must be an object"); 
    // do stuff 
    } 
} 
4

PHPにはルートクラスはありません。オブジェクトはさえstdClassから継承しません:

class Foo {} 
var_dump(new Foo instanceof stdClass); // bool(false) 
var_dump(get_parent_class(new Foo)); // bool(false) 

どうやらobjectのためのヒントを入力するためのPHPには既知の方法はobjectはPHPでのデータ型(arrayのような)で、objectへの型キャストがstdClassを得ていてもありません対象:

echo get_class((object) "string"); // stdClass 

私はis_object($obj)がfalseを返した場合は、例外をスローまたは致命的なエラーで死ぬための方法を言うことができる回避策として推測します。

+0

私はstdClassをインスタンス化できるので、すべてのオブジェクトの基本クラスでなければならないと考えました。毎日何か新しいことを学ぶ。私はPHPがなぜそうすることにしたのだろうと思う。 – dnagirl