no, non puoi, perché php non è "debolmente" tipizzato, ovvero i tipi ci sono ma non ci sono 
I Generics (o Templates) sono necessari in Java/C#/C++ perché sono linguaggi fortemente tipizzati che vengono compilati e quindi le dipendenze risolte in fase di compilazione mentre php viene "compilato" in fase di runtime e le dipendenze vengono risolte man mano che si presentano il che significa che se devi operare su una classe ben precisa ... a te non interessa nulla se non che abbia quei specifici metodi
Molto semplicemente al costruttore, o tramite un metodo, passi il "tipo" da instanziare (se devi instanziarlo all'interno della classe che ti serve) o alternativamente passi direttamente l'oggetto già instanziato
per intenderci
codice:
class TestA
{
public function Print()
{
echo "print AAA
";
}
}
class TestB
{
public function Print()
{
echo "print BBB
";
}
}
class TestGenerics
{
private $object;
public function __construct($Type)
{
$this->object = new $Type();
}
public function DoJob()
{
$this->object->Print();
}
}
$testA = new TestGenerics('TestA');
$testA->DoJob();
$testB = new TestGenerics('TestB');
$testB->DoJob();
aggiungendo l'interfaccia ...
[code]
codice:
interface ITest
{
public function Print();
}
class TestA : ITest
{
public function Print()
{
echo "print AAA
";
}
}
class TestB : ITest
{
public function Print()
{
echo "print BBB
";
}
}
class TestGenerics
{
private $object;
public function __construct($Type)
{
if (is_subclass_of($Type, 'ITest') === false)
{
throw new exception("Class " . $Type . " doesn't implement ITest interface");
}
$this->object = new $Type();
}
public function DoJob()
{
$this->object->Print();
}
}
$testA = new TestGenerics('TestA');
$testA->DoJob();
$testB = new TestGenerics('TestB');
$testB->DoJob();
non commento il codice, ma penso tu lo capisca perfettamente