Desde PHP 5 se incorpora la implicación de tipos. Ahora, las funciones pueden obligar a que sus parámetros 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 el valor predeterminado del parámetro, será permitido como un argumento para llamada posterior.
Si se especifica una clase o una interfaz como tipo implicado también se permitirán todos sus hijos o implementaciones too.
La implicación de tipos no puede usarse con tipos escalares como int o string. Tampoco están permitidos los 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 $callback, $data) {
call_user_func($callback, $data);
}
}
// Otra clase de ejemplo
class OtraClase {
public $var = 'Hola Mundo';
}
?>
Si no se satisface el type hint, 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: Imprime en pantalla Hola Mundo
$miclase->prueba($otraclase);
// Error Fatal: El argumento 1 debe ser un array
$miclase->prueba('una cadena');
// Funciona: Imprime en pantalla el array
$miclase->prueba(array('a', 'b', 'c'));
// Funciona: Imprime en pantalla ArrayObject
$miclase->prueba_interface(new ArrayObject(array()));
// Funciona: Imprime en pantalla int(1)
$miclase->prueba_callable('var_dump', 1);
?>
Los tipos sugeridos tambíen se pueden 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);
?>
Tipo implicado que acepta valores de tipo NULL:
<?php
/* Se acepta el valor NULL */
function prueba(stdClass $obj = NULL) {
}
prueba(NULL);
prueba(new stdClass);
?>