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
.