PHPクラスで関数ポリモーフィズムを使用したいと考えています。いくつかの子クラス関数の関数の入力型をチェックするつもりです。
class A
{
public function setValue(Type $value)
{
}
}
class B extends A
{
public function setValue(XType $value)
{
}
}
class C extends A
{
public function setValue(ZType $value)
{
}
}
$b = new B();
$b->setValue(new XType());
と
class Type {};
class XType extends Type;
class ZType extends Type;
私が探している動作は、setValueが間違った引数の型で呼び出された場合に PHP が例外をスローすることです。
上記のコードを使用すると、エラーが発生します。
ランタイム通知: B::setValue() の宣言は、B.php 行の A::setValue(Type $value) と互換性がある必要があります..
これは、私が望む動作を得ることができた方法です:
class B extends A
{
public function setValue(Type $value)
{
if (!$value instanceof XType) {
throw new \Exception("value $value not allowed, should be of type XType");
parent::setValue($value);
}
}
}
しかし、PHP コアにそのコードのビットを処理させてくれることをうれしく思います :)
私は十分に明確ではなかったことがわかります..
呼び出し元にデフォルトの動作A::setValue()と、特定の子クラスに関する特定の動作B::setValue()を提供しようとしています。したがって、呼び出し元がB::setValue()を呼び出そうとするとサポートされていない型の場合、エラーが発生しますが、たとえばD::setValue()を呼び出すと、デフォルトのA::setValue()が取得されます。