親クラスにはプロパティ名だけ定義しておいて値は子クラスで定義したい、というパターンがありました。
例えばEntityオブジェクトを詰め込んでcollectionにするためのクラスがあるとして、
class EntityCollection {
protected $entityName;
public function __construct(array $entities)
{
foreach ($entities as $entity) {
if (!($entity instanceof $this->entityName)) {
throw new Exception();
}
}
}
public function getById($id)
{
// $idで指定したentityを一つ取得する
}
}
class UserEntityCollection {
protected $entityName = UserEntity::class;
}
EntityCollection
のテストをしたいが親クラス自体はentityが定まっていないのでこのままではテストができません。
かと言って$entityName
をpublicにすると値を上書きできてしまうのでやりたくありません。
そこでテスト内で親クラスを継承した無名クラスを作ります。
class EntityCollectionTest
{
public function testGetById()
{
$userEntity = new UserEntity(); // ここは任意のEntityを使用する (1)
$testClass = new class($userEntity) extends EntityCollection {
$entityName = UserEntity::class; // (1) のクラス名を指定
}
}
}
(new EntityCollectionTest)->testGetById();
こうすればテストの時だけ好きなentityName
を定義できます。