PHPStanを使うとPHPでもジェネリクス型が使える
なのでこんな感じで書いてみたら...
<?php
interface Animal{
/**
* @template E of Food
* @param E $food
* @return void
*/
public function eat($food): void;
}
interface Food {}
class Cat implements Animal {
/**
* @param Fish $fish
* @return void
*/
public function eat(Fish $fish): void
{
//うまいうまい
}
}
class Fish implements Food{
}
Catのeat()がインターフェースのものと互換性がないと怒られます。
原因は簡単で、PHPは型境界を理解してくれないから
なので、仮引数型の宣言をやめて、PHPDocにだけ書くようにする。
<?php
interface Animal{
/**
* @template E of Food
* @param E $food
* @return void
*/
public function eat($food): void;
}
interface Food {}
class Cat implements Animal {
/**
* @param Fish $fish
* @return void
*/
public function eat($fish): void
{
//うまいうまい
}
}
class Fish implements Food{
}
これでよし