Clases y Objetos
PHP Manual

Implicación de tipos

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

?>

Clases y Objetos
PHP Manual