class prueba
{
    function test(Alan $alan, Book $book, array $array)
    {
        echo "metodo de prueba clase prueba";
    }
}
function test(Alan $alan, Book $book, array $array)
{
    echo "metodo de prueba normal";
}
class Alan
{
}
class Book
{
}
$array = array(1, 2, 3, 4, 5);
$prueba = new Prueba();
$alan = new Alan();
$book = new Book();
$prueba->test($alan, $book, (array) "stringPrueba");
echo "<br/>";
test($alan, $book, $array);
//casos
//1. se mandaron los parametros especificados => se tuvo los resultados esperados
//2. no se mando el array => te tira un catchable fatal error el argumento 3 debe de ser de tipo array
//3. se mandaron 2 books en vez de un 1 alan => catchable error argument debe de ser de tipo Alan
//4. se mando una cadena en vez de un arreglo => catchable error argument debe ser un array.
//5. se mando una cadena en vez de un arreglo pero se casteo a array => todo funciona normal