Introduced in PHP 8.1, never
is a return type that can be added to functions or methods to indicate that:
- It will never return a value (including an empty
return
), and; - It's guaranteed to halt further execution of the script, either by throwing an exception or by terminating with a
die
orexit
call.
For example:
// PHP 8.1+ function redirect(string $url): never { header("Location: $url"); exit(); } redirect('https://www.designcise.com'); // anything that follows is guaranteed to not be executed
If a function/method with never
return type does not throw an exception or terminate with a die
or exit
call, then PHP will throw a TypeError
:
// PHP 8.1+
function redirect(string $url): never {
header("Location: $url");
}
// TypeError: redirect(): never-returning function must not implicitly return
redirect('https://www.designcise.com');
never
is a "bottom" type, which means that it is a subtype of every other type (including void
), and there's nothing more specific than it. It obeys the following rules:
- Return type covariance is allowed;
- Return type contravariance is not allowed;
- It cannot be used in a union or intersection type.
In the following example, you can see how return type covariance is allowed:
// PHP 8.1+ class A { public function foo(): string {} } class B extends A { public function foo(): never {} }
In the following example, you can see how return type contravariance is not allowed:
// PHP 8.1+
class A {
public function foo(): never {}
}
class B extends A {
// Fatal error: Declaration of B::foo(): string must be compatible with A::foo(): never
public function foo(): string {}
}
In the following examples, you can see how never
cannot be used in a union or intersection type:
// PHP 8.1+
class A {
// Fatal error: never can only be used as a standalone type
public function foo(): never | string {}
}
// PHP 8.1+
class A {
// Fatal error: Type never cannot be part of an intersection type
public function foo(): never & string {}
}
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.