2010-09-06 10 views
1

Dire que j'ai un fichier fichier foo.php:Comment créer une instance d'une classe PHP existante en toute sécurité et dynamiquement?

<?php 
interface ICommand 
{ 
    function doSomething(); 
} 

class Foo implements ICommand 
{ 
    public function doSomething() 
    { 
     return "I'm Foo output"; 
    } 
} 

?> 

Si je veux créer une classe de type Foo je pourrais utiliser:

require_once("path/to/Foo.php") ; 
$bar = new Foo(); 

Mais dire que j'ai créé un Chain of Command Pattern et je avoir un fichier de configuration qui enregistre toutes les classes possibles et crée une instance de ces classes en fonction des chaînes présentes dans le fichier de configuration. Comment puis-je m'assurer que ces classes sont réellement où le fichier de configuration dit qu'elles sont? Et que se passe-t-il si une classe n'est pas là (mais le fichier l'est), va-t-elle créer une instance d'une classe générée dynamiquement, qui n'a pas d'autre description?

Répondre

4

Vous pouvez utiliser class_exists pour vérifier si une classe a été définie.

Si vous appelez une classe dynamiquement et si vous appelez une méthode de cette classe à partir de la même fonction, vous pouvez également appeler dynamiquement cette méthode (à moins que toutes vos classes aient exactement la même méthode. cas, vous pouvez également utiliser method_exists

Enfin, vous pouvez également utiliser file_exists que le fichier peut être inclus:

register("Foo", "path/to/Foo.php", "bar", array('arg1', 'arg2')); 

function register($className, $classPath, $methodName, $args) 
{ 
    if(!file_exists($classPath)) return false; 

    require_once($classPath); 

    if(!class_exists($className)) return false; 

    $classInstance = new $className; 

    if(!method_exists($classInstance, $methodName)) return false; 

    $classInstance->$methodName($args); 
} 
+0

En fait, mes cours ont tous la même méthode (ils implémentent tous l'interface que je décris au début de ma question). Mais c'est une bonne idée de faire cette vérification, car c'est possible ajouter de nouvelles implémentations plus tard. – Timo

1

Si vous essayez d'instancier une classe qui n'est pas définie, par ex.

$o = new IsNotDefined(); 

le autoloader est appelé et le nom de la classe est passée comme paramètre. Si l'autochargeur enregistré fournit une implémentation de la classe, le script continue "normalement". Si aucune implémentation de la classe ne peut être fournie, php s'arrête avec Fatal error: Class 'IsNotDefined' not found.

Vous pourriez également être intéressé par

+0

Merci pour la réponse que j'ai lu la documentation __autoloader et ce que vous dites est juste pour les versions ci-dessous 5.3 (qui, naturellement, je travaille avec (par exemple 5.2) donc pas d'exceptions pour moi;)) Malheureusement, j'ai un comportement par défaut à ma disposition, donc une erreur fatale est un non-go. – Timo

Questions connexes