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()
{
}
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()
{
}
Avec method_exists Je suppose?
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).
Cela fonctionne sans avoir à créer un objet. –
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.
API de réflexion exposer isInstantiable()
$reflectionClass = new ReflectionClass($class);
echo "Is $class instantiable? ";
var_dump($reflectionClass->IsInstantiable());
Je pense que __construct est la syntaxe PHP5, non? Peut-être que les tags devraient être corrigés ensuite (suppression de php4) – ChristopheD
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
mais si la méthode est en fait privée, elle affecte cette capacité, mais je ne sais pas comment la vérifier. –