typehinting:メソッドは、オブジェクトがある任意の$ argをを受け入れるべき
-
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
}
}