Desde PHP 5, se incorpora la implicación de tipos. Ahora se puede obligar a que los parámetros de las funciones sean objetos (especificando el nombre de la clase en el prototipo de la función), interfaces, arrays (desde PHP 5.1) o tipos callable (despe PHP 5.4). Sin embargo, si se usa NULL como valor predeterminado del parámetro, estará permitido como un argumento para cualquier llamada posterior.
Si se especifica una clase o una interfaz como tipo implicado, también estarán permitidos todos sus hijos o implementaciones.
La implicación de tipos no puede usarse con tipos escalares como int o string. Tampoco están permitidos los recursos ni traits.
Ejemplo #1 Ejemplos de implicación de tipos
<?php
// Una clase de ejemplo
class MiClase
{
/**
* Una función de prueba
*
* El primer parámetro debe ser un objeto del tipo OtraClase
*/
public function prueba(OtraClase $otraclase) {
echo $otraclase->var;
}
/**
* Otra función de prueba
*
* El primer parámetro debe ser un array
*/
public function prueba_array(array $array_entrada) {
print_r($array_entrada);
}
/**
* El primer parámetro debe ser un iterador
*/
public function prueba_interface(Traversable $iterador) {
echo get_class($iterador);
}
/**
* El primer parámetro debe ser de tipo callable
*/
public function prueba_callable(callable $llamada_retorno, $datos) {
call_user_func($llamada_retorno, $datos);
}
}
// Otra clase de ejemplo
class OtraClase {
public $var = 'Hola Mundo';
}
?>
Si no se satisface la implicación de tipos, se produce un error fatal capturable
<?php
// Una instancia de cada clase
$miclase = new MiClase;
$otraclase = new OtraClase;
// Error Fatal: El argumento 1 debe ser un objeto de la clase OtraClase
$miclase->prueba('hola');
// Error Fatal: El argumento 1 debe ser una instancia de OtraClase
$foo = new stdClass;
$miclase->prueba($foo);
// Error fatal: El argumento 1 no puede ser null
$miclase->prueba(null);
// Funciona: Muestra en pantalla Hola Mundo
$miclase->prueba($otraclase);
// Error Fatal: El argumento 1 debe ser un array
$miclase->prueba_array('un string');
// Funciona: Muestra en pantalla el array
$miclase->prueba_array(array('a', 'b', 'c'));
// Funciona: Muestra en pantalla ArrayObject
$miclase->prueba_interface(new ArrayObject(array()));
// Funciona: Muestra en pantalla int(1)
$miclase->prueba_callable('var_dump', 1);
?>
La implicación de tipos tambíen se puede usar con funciones:
<?php
// Una clase de ejemplo
class MiClase {
public $var = 'Hola Mundo';
}
/**
* Una función de prueba
*
* El primer parámetro debe ser un objeto del tipo MiClase
*/
function miFunción (MiClase $foo) {
echo $foo->var;
}
// Funciona
$miclase = new MiClase;
miFunción($miclase);
?>
La implicación de tipos acepta valores NULL:
<?php
/* Se acepta el valor NULL */
function prueba(stdClass $obj = NULL) {
}
prueba(NULL);
prueba(new stdClass);
?>