Поскольку оттуда указывает, вы можете использовать class_implements()
. Как и в Reflection, это позволяет вам указывать имя класса в виде строки и не требует экземпляра класса:
interface IInterface
{
}
class TheClass implements IInterface
{
}
$interfaces = class_implements('TheClass');
if (isset($interfaces['IInterface'])) {
echo "Yes!";
}
class_implements()
является частью расширения SPL.
См .: http://php.net/manual/en/function.class-implements.php
Тесты производительности
Некоторые простые тесты производительности показывают стоимость каждого подхода:
С учетом экземпляра объекта
Object construction outside the loop (100,000 iterations)
____________________________________________
| class_implements | Reflection | instanceOf |
|------------------|------------|------------|
| 140 ms | 290 ms | 35 ms |
'--------------------------------------------'
Object construction inside the loop (100,000 iterations)
____________________________________________
| class_implements | Reflection | instanceOf |
|------------------|------------|------------|
| 182 ms | 340 ms | 83 ms | Cheap Constructor
| 431 ms | 607 ms | 338 ms | Expensive Constructor
'--------------------------------------------'
Дано только имя класса
100,000 iterations
____________________________________________
| class_implements | Reflection | instanceOf |
|------------------|------------|------------|
| 149 ms | 295 ms | N/A |
'--------------------------------------------'
Где дорогой __construct ():
public function __construct() {
$tmp = array(
'foo' => 'bar',
'this' => 'that'
);
$in = in_array('those', $tmp);
}
Эти тесты основаны на этом простом коде .