I need, belirli bir sınıfın uzanır veya belirli bir arabirimi uygulayan olup olmadığını kontrol etmek.
Sınıf adı değişken bir dize, yani Note ki, bu sınıfın bir örneğini orada olmayacak.
Kullanıcılar sınıfların listesinden bir sınıf seçmek gerekiyor ve sistem sınıfı, belirli bir arabirimi uygulayan olup olmadığını kontrol etmek gerekiyordu. Sınıfların listesi, (şu anda çalışan PHP yazılım göre) değişken bu sınıflardan bazılarını başlatıldı edilebilir ve diğerleri olamaz.
İşte kullanıyorum kodu:
function is_instance_of($obj,$cls){
if(is_string($obj))$obj=new $obj();
if(PHP_MAJOR_VERSION>4)return $obj instanceof $cls;
if(PHP_MAJOR_VERSION>3)return is_a($obj,strtolower($cls));
return false;
}
var_dump(is_instance_of('MyClass','IMyInterface')); // in theory, true
var_dump(is_instance_of('Closure','IMyInterface')); // FATAL ERROR
Bu son testi aşağıdaki hatayı gösterir:
Yakalanabilir ölümcül hata: 'Kapatma' ve Destekleme C izin verilmez: \ Users \ abcdefghijklmn \ debug.php hat XX
Ben denedim şeyler:
- Kullanımı
$obj=new @$obj();
: - hatası gizli ama hala hatalar / ölür. try{}catch(){}
kusurlu blok etrafında kullanarak: - Farklı hiçbir şey olmuyor'class' instanceof 'class'
($ obj bir dize olduğu) kullanarak: - iadelerfalse
kayıtsız şartsız
Please note that the mandatory class initialization used in this method...sucks. Creating instances means unnecessary memory consumption, loss in speed and more prone to errors (imagine some weirdo class that when instantiated without parameters it proceeds to destroy your HDD ;) ). So, if there's any other way, I'd simply love to know about it.
Edit: This is (hopefully) the final code:-
/**
* Cross-version instanceof replacement.
* @param object $obj The instance to check.
* @param stirng $cls The class/interface name to look for.
* @return boolean Whether an object extends or implements a particular class
* or interface.
* @link http://stackoverflow.com/questions/4365567/php-instanceof-over-strings-and-non-initializable-classes
*/
function is_instance_of($obj,$cls){
if(is_string($obj) || PHP_MAJOR_VERSION>4){
$rc=new ReflectionClass($obj);
return $rc->implementsInterface($cls);
}else{
if(PHP_MAJOR_VERSION>3)return is_a($obj,strtolower($cls));
return false;
}
}