Clases y Objetos
PHP Manual

Implicación de Tipos

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);

?>

Clases y Objetos
PHP Manual