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 sus parámetros a que 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, 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 Resources y 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('un string');

// Funciona: Muestra en pantalla el array
$miclase->prueba(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 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);
?>

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