PHP es un lenguaje en el que el tipo de datos asociado a una variable no es declarado estrictamente (es decir, un lenguaje libremente tipeado), pero en PHP 5 es posible el aludir al tipo de objeto que se espera como parámetro en un método o función.
<?php
    
abstract class Combustible {
        abstract function 
usar();
    }

    class 
Kerosene extends Combustible {
        function 
usar() {
            return 
"Glub, glub, glub!";
        }
    }
    
    class 
Gasolina extends Combustible {
        function 
usar() {
            return 
"Tink, tink, tink!";
        }
    }
    
    class 
Cocina {
       function 
llenar(Kerosene $comb) {
           echo 
'cocina: '.$comb->usar();
       }
    }

    class 
Carcocha {
        function 
llenar(Combustible $comb) {
            echo 
'carcocha: '.$comb->usar();
        }
    }

    
$kero = new Kerosene();
    
$gas = new Gasolina();
    
    
$combi = new Carcocha();
    
$coci = new Cocina();
    
    
// no hay problema
    
$combi->llenar($kero);
    
$combi->llenar($gas);
    
    
$coci->llenar($kero);
    
// la línea siguiente generaria un error
    
$coci->llenar($gas);
?>
... ejecutando esto para mostrar el error
carcocha: Glub, glub, glub
carcocha: Tink, tink, tink
cocina: Glub, glub, glub
Fatal error: Argument 1 must be an 
instance of Kerosene in 
typehinting.php on line 19