Bir sınıf örneği göz önüne alındığında, bunun belirli bir arabirimi uygulayan olmadığını belirlemek mümkün mü? Bildiğim kadarıyla, doğrudan yapmak yerleşik bir fonksiyonu yoktur. Ben (varsa) ne gibi seçenekler var?
interface IInterface
{
}
class TheClass implements IInterface
{
}
$cls = new TheClass();
if ($cls instanceof IInterface)
echo "yes"
Sen "örneği" operatörünü kullanabilirsiniz. Bunu kullanmak için, sol işlenen bir sınıf örneği ve sağ işlenen bir arayüz. Nesnenin belirli bir arabirimi uygulayan eğer true döndürür.
Nelson LaQuet nesnesi bir arabirimi uygulayan bir sınıf örneği ise instanceof
test etmek için kullanılan işaret.
Ama instanceof
bir sınıf türü ve bir arayüz arasında ayrım yapmaz. Nesne class IInterface
adı olur o olup olmadığını bilmiyorum.
Ayrıca özellikle bu test PHP yansıma API kullanabilirsiniz:
$class = new ReflectionClass('TheClass');
if ($class->implementsInterface('IInterface'))
{
print "Yep!\n";
}
therefromhere belirttiği gibi, kullanabilirsiniz class_implements()
. Sadece Yansıma gibi, bu bir dize olarak sınıf adını belirtmek için izin verir ve sınıfını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ı bir parçasıdır.
Bkz: http://php.net/manual/en/function.class-implements.php
Bazı basit performans testleri, her yaklaşımın maliyetleri gösterir:
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 | '--------------------------------------------'
Nerede pahalı __ construct () 'dir:
public function __construct() {
$tmp = array(
'foo' => 'bar',
'this' => 'that'
);
$in = in_array('those', $tmp);
}
Bu testler, this simple code dayanmaktadır.
Sadece gelecek aramalar yardım etmek is_subclass_of (PHP 5.3.7 +) de iyi bir çeşididir:
if (is_subclass_of($my_class_instance, 'ISomeInterfaceName')){
echo 'I can do something !';
}