2009-12-09 8 views
2

Comment est-ce que je détecte d'une certaine classe a la méthode de constructeur dedans? par exemple:PHP: Comment détecter si une certaine classe a un constructeur?

function __construct() 
{ 
} 
+0

Je pense que __construct est la syntaxe PHP5, non? Peut-être que les tags devraient être corrigés ensuite (suppression de php4) – ChristopheD

+1

Pourquoi avez-vous besoin de savoir? Cela n'affecte pas la possibilité de créer une nouvelle instance. Vous pouvez toujours consulter les PHPDocs. – Don

+0

mais si la méthode est en fait privée, elle affecte cette capacité, mais je ne sais pas comment la vérifier. –

Répondre

5
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; 
} 

Utilisation method_exists() peut avoir ses avantages, mais considérez ce code

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; 

Affichera "g a constructeur" et le résultat aussi une erreur fatale lors de la création d'une nouvelle instance de g. Ainsi, la seule existence d'un constructeur ne signifie pas nécessairement que vous serez en mesure de créer une nouvelle instance de celui-ci. La fonction create peut bien sûr renvoyer la même instance à chaque fois (ce qui en fait un singleton).

+1

Cela fonctionne sans avoir à créer un objet. –

3

Il y a plusieurs façons, et cela dépend en fait de ce que vous cherchez.

method_exists() vous indiquera si une méthode a été déclarée pour cette classe. Cependant, cela ne signifie pas nécessairement que la méthode est appelable ... elle pourrait être protégée/privée. Les singletons utilisent souvent des constructeurs privés.

Si c'est un problème, vous pouvez utiliser get_class_methods(), et vérifier le résultat pour les deux « __construct » (style PHP 5) ou le nom de la classe (style PHP 4), get_class_methods retourne uniquement les méthodes qui peuvent être appelés à partir le contexte actuel.

1

API de réflexion exposer isInstantiable()

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