typehinting:メソッドは、オブジェクトがある任意の$ argをを受け入れるべき

StackOverflow https://stackoverflow.com/questions/4218693

  •  26-09-2019
  •  | 
  •  

質問

私は、addメソッドを持つクラス「コレクション」を持っています。 addメソッドは、オブジェクトのみを受け入れる必要があります。だから、これは望ましい動作です。

$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
PHPマニュアルによると、一つはクラス名と$argを巻頭でメソッドをtypehintすることができます。すべてのPHPクラスはstdClassの子であるので、私は、このメソッドのシグネチャが働くだろう考え出します:

public function add(stdClass $obj);

しかし、それは「引数があるstdClassのインスタンスでなければなりません」で失敗します。

私は私で定義された親クラスに署名を変更する場合は、

は、それが動作します:

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

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

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

役に立ちましたか?

解決

JavaのObjectクラスとは異なり、PHPは、 にオブジェクトの基本クラスを持っていません。オブジェクトは継承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クラスを定義します。

他のヒント

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の場合、致命的なエラーで例外またはダイをスローする方法を言うことができる回避策としてます。

私は推測します

まあ事は、PHPは依然として、動的言語であるということ、である、とタイプヒントはまさにそれです:ヒント。私はあなたがhref="http://php.net/manual/en/function.is-object.php" rel="nofollow"> is_objectするまたは同様の方法

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

はPHP 7.2で今object型のヒントがあります。あなたが簡単に行うことができます。

class Collection {
  public function add(object $obj){
    //do stuff
  }
} 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top