<?php
class A {
protected $c;
protected $d;
public function set(B $test) {
static $testMap = [];
if (empty($testMap)) {
$testMap = [
C::class => 'setC', // only need to know which method to call
D::class => 'setD', //
];
}
if ($test === null) {
return;
}
$testType = get_class($test);
if (!array_key_exists($testType, $testMap)) {
throw new InvalidArgumentException(
sprintf(
"Encountered unexpected body type (%s) that isn't supported",
$testType
)
);
}
call_user_func([$this, $testMap[$testType]], $test); // uses $this to call the method on this object
// alternatively, $this->{$testMap[$testType]}($test);
}
/**
* @param C|null $c
*/
public function setC(C $c = null)
{
$this->c = $c;
}
/**
* @param D|null $d
*/
public function setD(D $d = null)
{
$this->d = $d;
}
}
abstract class B {
protected $data;
public function __construct($q = '')
{
$this->data = $q;
}
}
class C extends B {
}
class D extends B {}
$a1 = new A;
$a1->set(new C("test c1"));
var_dump($a1);
$a2 = new A;
$a2->set(new C("test c2"));
var_dump($a2);
$a3 = new A;
$a3->set(new C("test c3"));
var_dump($a3);