PHP: Nasıl belirli bir sınıfın constructor algılamak için?

4 Cevap

Nasıl yapıcı yöntemi kendisine belli bir sınıfın var tespit ediyorsunuz? örneğin:

function __construct()
{
}

4 Cevap

Ile method_exists sanırım?

function hasPublicConstructor($class) {
    try {
        $m = new ReflectionMethod($class, $class);
     if ($m->isPublic()) {
         return true;
     }
    }
    catch (ReflectionException $e) {
    }
    try {
     $m = new ReflectionMethod($class,'__construct');
     if ($m->isPublic()) {
         return true;
     }
    }
    catch (ReflectionException $e) {
    }
    return false;
}

) (Method_exists kullanarak bu artıları var, ancak bu kodu düşünebilirsiniz

class g {
    protected function __construct() {

    }
    public static function create() {
     return new self;
    }
}

$g = g::create();
if (method_exists($g,'__construct')) {
    echo "g has constructor\n";
}
$g = new g;

Bu irade çıktı "g kurucusu vardır" ve g yeni bir örneğini oluştururken, aynı zamanda ölümcül bir hata neden. Yani yapıcı tek varlığı mutlaka bunun yeni bir örneğini oluşturmak mümkün olacak anlamına gelmez. Oluşturmak fonksiyonu elbette aynı örneğe her zaman (böylece o singleton'ununu yapma) geri dönebilirler.

Orada bir kaç yolu var, ve bu tür aradığınız tam olarak ne bağlıdır.

Bir yöntem declared o sınıf için kaldıysa method_exists() söyleyecektir. Ancak, bu yöntem, zorunlu olarak callable ... o korunabilir / özel olduğu anlamına gelmez. Singletons genellikle özel kurucular kullanın.

Bu bir sorun varsa, get_class_methods() kullanın ve "__construct" (PHP 5 tarzı) veya sınıfın adına (PHP 4 tarzı) olarak get_class_methods ya için sonucunu kontrol edebilirsiniz yalnızca geçerli bağlamda çağrılabilir yöntemleri döndürür.

Reflection API isInstantiable maruz ()

  $reflectionClass = new ReflectionClass($class);
  echo "Is $class instantiable?  ";
  var_dump($reflectionClass->IsInstantiable());