ну нечто такого, только там не только скалярным типом можно, но и любым другим, просто сам синтаксис также позволяет указать программисту где можно привести один тип к другому, а где требуется жесткая проверка.
function log(~integer $level, ~string $msg) { echo "#$level: $msg"; }
function log_strict(integer $level, string $msg) { echo "#$level: $msg"; }
log(1,"preved"); // #1: preved
log("preved", 1); // warning string "preved" to int // #0: 1
log(1, array("preved","medved")); // warning array("preved", "medved") to string // #1: Array
log_strict(1,"preved"); // #1: preved
log_strict("preved", 1); // error string "preved" to int
log_strict(1, array("preved","medved")); // error array("preved", "medved") to string
Просто такие warning/error можно удобно перехватывать и сбрасывать exception, если переписать set_error_handler