62 votes

Comment vérifier un type d'objet spécifique en PHP

J'ai une méthode qui accepte un objet PDO comme argument, pour permettre à l'utilisateur d'utiliser une connexion existante, plutôt que de la méthode pour ouvrir un nouveau, et d'économiser les ressources:

public static function databaseConnect($pdo = null) {

Je suis conscient de l' is_object() pour vérifier si l'argument est un objet, mais je veux vérifier si $pdo est un objet PDO, et non pas un objet.

Parce que l'utilisateur peut facilement entrer (par erreur?) un autre type d'objet, une mysqli ou tel, et le script en entier s'effondrera.

En bref: Comment puis-je vérifier une variable d'un type spécifique de l'objet?

86voto

Dan Lugg Points 6438

Vous pouvez utiliser instanceof:

if ($pdo instanceof PDO) {
    // it's PDO
}

Attention cependant, vous ne pouvez pas nier, comme !instanceof, donc, si vous voulez au lieu de faire:

if (!($pdo instanceof PDO)) {
    // it's not PDO
}

Aussi, à la recherche de plus de votre question, vous pouvez utiliser un objet de type indicateur qui permet de faire respecter les exigences, ainsi que de simplifier votre logique de contrôle:

function connect(PDO $pdo = null) {
    if (null !== $pdo) {
        // it's PDO since it can only be
        // NULL or a PDO object
    }
}

connect(new SomeClass()); // fatal error, if SomeClass doesn't extend PDO

Addendum (figuré je voudrais ajouter un résumé de l'information depuis ce Q/A obtient quelques vues)

Tapé arguments peuvent être obligatoires ou facultatives:

// required, only PDO is valid
function connect(PDO $pdo) { }

// optional, only PDO and NULL (can be omitted) are valid
function connect(PDO $pdo = null) { }

Non typée arguments qui permettent une certaine souplesse par le biais de conditions explicites:

// accepts any argument, checks for PDO in body
function connect($pdo) {
    if ($pdo instanceof PDO) {
        // ...
    }
}

// accepts any argument, checks for non-PDO in body
function connect($pdo) {
    if (!($pdo instanceof PDO)) {
        // ...
    }
}

// accepts any argument, checks for method existance
function connect($pdo) {
    if (method_exists($pdo, 'query')) {
        // ...
    }
}

Comme pour ces derniers (à l'aide de method_exists- )), je suis un peu mélangé à mon avis. Des gens venant de Ruby serait-il trouver familiers respond_to?, pour le meilleur ou pour le pire. Je serais personnellement écrire une interface et d'effectuer un type normal-allusion à l'encontre de:

interface QueryableInterface { 
    function query();
}

class MyPDO extends PDO implements QueryableInterface { }

function connect(QueryableInterface $queryable) { }

Cependant, ce n'est pas toujours possible; dans cet exemple, PDO objets ne sont pas valides paramètres comme le type de base n'est pas mise en œuvre d' QueryableInterface.

11voto

Oliver A. Points 2008

utilisation

  bool is_a ( object $object , string $class_name )
 

Cela fonctionnera aussi pour les classes d'enfants.

voir http://php.net/is-a

EDIT: Ou vous pouvez utiliser l'indication de type:

 public static function databaseConnect(PDO $pdo = null) {...
 

3voto

Weston C Points 2482

Comme l'a souligné dans d'autres réponses, instanceof, get_class, et is_a sont probablement ce que vous cherchez.

Cependant, plutôt que de coder dans un grand nombre de gardes que le test pour le type, certains développeurs trouver plus productif (et plus facile à lire) pour simplement laisser l'exécution de la poignée de l'application de la loi, en particulier lorsque vous parlez appelle d'autres programmeurs vont faire (lorsqu'un programmeur fait une erreur, app-rupture de fortes plaintes sont sans doute une bonne chose).

Si vous avez vraiment besoin de ne pas avoir le script de tomber en morceaux quand un programmeur utilise votre méthode incorrecte de l'enveloppement de l'article pertinent du code (dans ce cas, probablement à l'intérieur de databaseConnect) dans un bloc try, peut-être que l'utilisation set_error_handler lancer des exceptions sur des erreurs de script, et ensuite mis en place un ou plusieurs blocs catch qui a indiqué qu'à faire quand une exception condition se produit.

2voto

Sarfraz Points 168484

Je pense que vous pouvez utiliser instanceof quelque chose comme:

 if ($pdo instanceof YOUR_PDO_OBJECT_INSTANCE) {
   // it is...
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X