PHP 5 introduz Indução de Tipo. Funções podem forçar que os parâmetros sejam objetos (especificando o nome da classe no protótipo da função) ou array (a partir do PHP 5.1). Contudo, se NULL é usado como o valor padrão do parametro, ele será permitido como um argumento nas chamadas à função.
Exemplo #1 Exemplo Indução de Tipo
<?php
// Uma classe de exemplo
class MinhaClasse
{
/**
* Uma função de teste
*
* Primeiro parâmetro deve ser um objeto do tipo OutraClasse
*/
public function teste(OutraClasse $outraclasse) {
echo $outraclasse->var;
}
/**
* Outra função de teste
*
* Primeiro parâmetro deve ser um array
*/
public function testa_array(array $array_de_entrada) {
print_r($array_de_entrada);
}
}
// Outro classe de exemplo
class OutraClasse {
public $var = 'Alô Mundo';
}
?>
Não satisfazer a indução de tipo resulta em erro fatal (Catchable fatal error).
<?php
// Uma instância de cada classe
$minhaclasse = new MinhaClasse;
$outraclasse = new OutraClasse;
// Erro Fatal: Argumento 1 deve ser um objeto da classe OutraClasse
$minhaclasse->teste('hello');
// Erro Fatal: Argumento 1 deve ser uma instância de OutraClasse
$foo = new stdClass;
$minhaclasse->teste($foo);
// Erro Fatal: Argumento 1 deve ser diferente de null
$minhaclasse->teste(null);
// Funciona: Imprime Alô Mundo
$minhaclasse->teste($outraclasse);
// Erro Fatal: Argumento 1 deve ser um array
$minhaclasse->testa_array('a string');
// Funciona: Imprime o array
$minhaclasse->testa_array(array('a', 'b', 'c'));
?>
Indução de tipo também funciona com funções:
<?php
// Um exemplo de classe
class MinhaClasse {
public $var = 'Alô Mundo';
}
/**
* Uma função de teste
*
* Primeiro parâmetro deve ser um objeto do tipo MinhaClasse
*/
function MinhaFuncao (MinhaClasse $foo) {
echo $foo->var;
}
// Funciona
$minhaclasse = new MinhaClasse;
MinhaFuncao($minhaclasse);
?>
Type hinting permitindo valor NULL:
<?php
/* Aceitando valor NULL value */
function test(stdClass $obj = NULL) {
}
test(NULL);
test(new stdClass);
?>
Indução de tipo só pode ser usado com tipos objetos. Indução tradicional com int e string não são suportados.