Yanıtlar:
interface IInterface
{
}
class TheClass implements IInterface
{
}
$cls = new TheClass();
if ($cls instanceof IInterface) {
echo "yes";
}
"İnstanceof" operatörünü kullanabilirsiniz. Bunu kullanmak için, sol işlenen bir sınıf örneğidir ve sağ işlenen bir arabirimdir. Nesne belirli bir arabirimi uygularsa true değerini döndürür.
Gibi therefromhere işaret, kullanabilirsiniz class_implements()
. Tıpkı Yansıma'da olduğu gibi, bu da sınıf adını dize olarak belirtmenize olanak tanır ve sınıfın bir örneğini gerektirmez:
interface IInterface
{
}
class TheClass implements IInterface
{
}
$interfaces = class_implements('TheClass');
if (isset($interfaces['IInterface'])) {
echo "Yes!";
}
class_implements()
, SPL uzantısının bir parçasıdır.
Bkz. Http://php.net/manual/en/function.class-implements.php
Bazı basit performans testleri her bir yaklaşımın maliyetini gösterir:
Döngü dışında nesne yapımı (100.000 iterasyon) ____________________________________________ | class_implements | Yansıma | instanceOf | | ------------------ | ------------ | ------------ | | 140 ms | 290 ms | 35 ms | '--------------------------------------------' Döngü içinde nesne yapımı (100.000 iterasyon) ____________________________________________ | class_implements | Yansıma | instanceOf | | ------------------ | ------------ | ------------ | | 182 ms | 340 ms | 83 ms | Ucuz Oluşturucu | 431 ms | 607 ms | 338 ms | Pahalı Yapıcı '--------------------------------------------'
100.000 yineleme ____________________________________________ | class_implements | Yansıma | instanceOf | | ------------------ | ------------ | ------------ | | 149 ms | 295 ms | Yok | '--------------------------------------------'
Pahalı __construct () nerede:
public function __construct() {
$tmp = array(
'foo' => 'bar',
'this' => 'that'
);
$in = in_array('those', $tmp);
}
Bu testler bu basit koda dayanmaktadır .
nlaq instanceof
, nesnenin bir arabirimi uygulayan bir sınıf örneği olup olmadığını sınamak için kullanılabileceğini belirtir.
Ancak instanceof
bir sınıf türü ve bir arabirim arasında ayrım yapmaz. Nesnenin çağrılması gereken bir sınıf olup olmadığını bilmiyorsunuz IInterface
.
Bunu daha ayrıntılı olarak test etmek için PHP'deki yansıma API'sını da kullanabilirsiniz:
$class = new ReflectionClass('TheClass');
if ($class->implementsInterface('IInterface'))
{
print "Yep!\n";
}
class_implements()
instanceof
tekrar güvenle kullanabilirsiniz .
class_implements()
Tam bir yansıma yapmak yerine class_implements ve ardından in_array'ı aramak daha hızlı olduğu için +1
Sadece gelecekteki aramalara yardımcı olmak için is_subclass_of da iyi bir varyanttır (PHP 5.3.7+ için):
if (is_subclass_of($my_class_instance, 'ISomeInterfaceName')){
echo 'I can do it!';
}
is_a
Fonksiyon alternatif olarak burada eksik.
Belirtilen yollardan hangisinin en yüksek performans gösterdiğini kontrol etmek için bazı performans testleri yaptım.
instanceof [object] took 7.67 ms | + 0% | ..........
is_a [object] took 12.30 ms | + 60% | ................
is_a [class] took 17.43 ms | +127% | ......................
class_implements [object] took 28.37 ms | +270% | ....................................
reflection [class] took 34.17 ms | +346% | ............................................
Farkı görmek "hissetmek" için bazı noktalar eklendi.
Bununla oluşturulan: https://3v4l.org/8Cog7
Kontrol edilecek bir nesneniz varsa instance of
, kabul edilen cevapta belirtildiği gibi kullanın .
Eğer bir var sınıfını , kullanımını kontrol etmek is_a
.
Bir sınıfa sahip olmasını istediğiniz arabirime dayalı olarak başlatmak istediğinizde, kullanmak daha önceden hazırdır is_a
. Yalnızca bir istisna vardır - kurucu boş olduğunda.
Misal:
is_a(<className>, <interfaceName>, true);
Geri dönecek bool
. "Üçüncü parametre allow_string " o sınıf isimleri kontrol etmenizi sağlar olmadan sınıfını başlatmasını.