que - Cómo verificar un tipo específico de objeto en PHP
que es un objeto en php (4)
Como se señaló en otras respuestas, instanceof
, get_class
e is_a
son probablemente lo que estás buscando.
Sin embargo, en lugar de codificar en muchos guardias que prueban el tipo, algunos desarrolladores lo encuentran más productivo (y más fácil de leer) para dejar que el tiempo de ejecución maneje la aplicación, particularmente cuando se trata de llamadas que otros programadores harán ( cuando un programador comete un error, es posible que las quejas ruidosas de aplicación sean algo bueno).
Si realmente no necesita que el script se rompa cuando un programador usa su método incorrectamente, ajuste la sección relevante del código (en este caso, probablemente el interior de databaseConnect) en un bloque try , quizás use set_error_handler para arrojar excepciones en los errores del script , y luego configure uno o más bloques catch que indican qué hacer cuando ocurre una condición de excepción.
Tengo un método que acepta un objeto PDO como argumento, para permitir al usuario usar una conexión existente en lugar del método para abrir una nueva y guardar recursos:
public static function databaseConnect($pdo = null) {
Estoy al tanto de is_object()
para verificar si el argumento es un objeto, pero quiero verificar si $pdo
es un objeto PDO, y no solo un objeto.
Porque el usuario puede ingresar fácilmente (¿por error?) Un tipo diferente de objeto, un mysqli o similar, y todo el script se romperá.
En resumen: ¿cómo puedo verificar una variable para un tipo específico de objeto?
Creo que puedes usar instanceof
algo como:
if ($pdo instanceof YOUR_PDO_OBJECT_INSTANCE) {
// it is...
}
Puedes usar instanceof
:
if ($pdo instanceof PDO) {
// it''s PDO
}
Sin embargo, ten en cuenta que no puedes negar como !instanceof
, por lo que harías:
if (!($pdo instanceof PDO)) {
// it''s not PDO
}
Además, al examinar su pregunta, puede usar la sugerencia de tipo de objeto, que ayuda a aplicar los requisitos, y simplifica la lógica de verificación:
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
Los argumentos tipados pueden ser obligatorios u opcionales:
// 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) { }
Los argumentos sin fondos permiten la flexibilidad a través de condiciones explícitas:
// 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'')) {
// ...
}
}
En cuanto a lo último ( usando method_exists
), estoy un poco mezclado en mi opinión. A las personas que vengan de Ruby les resultará familiar respond_to?
, Para bien o para mal. Personalmente escribo una interfaz y realizo una sugerencia de tipo normal en contra de eso:
interface QueryableInterface
{
function query();
}
class MyPDO extends PDO implements QueryableInterface { }
function connect(QueryableInterface $queryable) { }
Sin embargo, eso no siempre es factible; en este ejemplo, los objetos PDO
no son parámetros válidos ya que el tipo base no implementa QueryableInterface
.
También vale la pena mencionar que los valores tienen tipos , no variables, en PHP. Esto es importante porque null
fallará una instanceof
verificación.
$object = new Object();
$object = null;
if ($object instanceof Object) {
// never run because $object is simply null
}
El valor pierde su tipo cuando se vuelve null
, una falta de tipo.
utilizar
bool is_a ( object $object , string $class_name )
Esto también funcionará para las clases de niños.
EDITAR: O puede usar sugerencias tipo:
public static function databaseConnect(PDO $pdo = null) {...