Вы можете использовать instanceof
:
if ($pdo instanceof PDO) {
// it's PDO
}
Имейте в виду, однако, что вы не можете отрицать, как !instanceof
, поэтому вместо этого вы должны сделать:
if (!($pdo instanceof PDO)) {
// it's not PDO
}
Кроме того, просматривая свой вопрос, вы можете использовать подсказку типа объекта, которая помогает обеспечить соблюдение требований, а также упростить логику проверки:
function connect(PDO $pdo = null)
{
if (null !== $pdo) {
// it's PDO since it can only be
// NULL or a PDO object (or a sub-type of PDO)
}
}
connect(new SomeClass()); // fatal error, if SomeClass doesn't extend PDO
Типизированные аргументы могут быть обязательными или необязательными:
// required, only PDO (and sub-types) are valid
function connect(PDO $pdo) { }
// optional, only PDO (and sub-types) and
// NULL (can be omitted) are valid
function connect(PDO $pdo = null) { }
Нетипизированные аргументы обеспечивают гибкость за счет явных условий:
// 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')) {
// ...
}
}
Что касается последнего (с использованием method_exists
), я немного смешано на мой взгляд. Людям, пришедшим из Ruby, будет знаком respond_to?
, поскольку лучше или хуже. Я бы лично написал интерфейс и выполнил бы обычную подсказку типа:
interface QueryableInterface
{
function query();
}
class MyPDO extends PDO implements QueryableInterface { }
function connect(QueryableInterface $queryable) { }
Однако это не всегда возможно; в этом примере объекты PDO
не являются допустимыми параметрами, поскольку базовый тип не реализует QueryableInterface
.
Также стоит отметить, что в PHP значения имеют типы, а не переменные. Это важно, потому что null
не пройдет проверку instanceof
.
$object = new Object();
$object = null;
if ($object instanceof Object) {
// never run because $object is simply null
}
Значение теряет свой тип, когда становится null
, отсутствием типа.
person
Dan Lugg
schedule
11.11.2011