{ // 各関数 } /** * @template E * @implements Result<never, E> */ final readonly class Err implements Result { /** * @param E $value */ public function __construct( private mixed $value, ) {} // エラー時の関数 } /** * @template T * @implements Result<T, never> */ final readonly class Ok implements Result { /** * @param T $value */ public function __construct( private mixed $value, ) {} // 成功時の関数 }
readonly class Err implements Result { // … public function isOk(): false { return false; } } /** * @template T * @implements Result<T, never> */ final readonly class Ok implements Result { // … public function isOk(): true { return true; } } /** * @template T * @template E */ interface Result { public function isOk(): bool; }
readonly class Err implements Result { // … public function isErr(): true { return true; } } /** * @template T * @implements Result<T, never> */ final readonly class Ok implements Result { // … public function isErr(): false { return false; } } /** * @template T * @template E */ interface Result { // … public function isErr(): bool; }
readonly class Err implements Result { // … } /** * @template T * @implements Result<T, never> */ final readonly class Ok implements Result { // … /** * @return T */ public function unwrap() { return $this->value; } } /** * @template T * @template E */ interface Result { // … }
readonly class Err implements Result { // ... /** * @return E */ public function unwrapErr() { return $this->value; } } /** * @template T * @implements Result<T, never> */ final readonly class Ok implements Result { // … } /** * @template T * @template E */ interface Result { // … }
readonly class Err implements Result { // ... /** * @template D * @param D $default * @return D */ public function unwrapOr(mixed $default) { return $default; } } /** * @template T * @implements Result<T, never> */ final readonly class Ok implements Result { // ... /** * @template D * @param D $default * @return T */ public function unwrapOr(mixed $default) { return $this->value; } } /** * @template T * @template E */ interface Result { // ... /** * @template D * @param D $default * @return ($this is Result<T, E> ? T|D : ($this is Result<never, E> ? D : T)) */ public function unwrapOr(mixed $default); }
* @template E * @implements Result<never, E> */ final readonly class Err implements Result /** * @template-covariant E * @implements Result<never, E> */ final readonly class Err implements Result
public function isErr(): bool; public function unwrapOr(mixed $default); } interface Result { public function isOk(): bool; public function isErr(): bool; public function unwrap(); public function unwrapErr(); public function unwrapOr(mixed $default); } PHPDocは 省略してます PHPDocは 省略してます
readonly class Err implements Result { // … } /** * @template T * @implements Result<T, never> */ final readonly class Ok implements Result { // … /** * @return T */ public function unwrap() { return $this->value; } } /** * @template T * @template E */ interface Result { // … }
readonly class Err implements Result { // … /** * @return never */ public function unwrap() { throw new LogicException('called Result->unwrap() on an err value'); } } /** * @template T * @implements Result<T, never> */ final readonly class Ok implements Result { // … /** * @return T */ public function unwrap() { return $this->value; } } /** * @template T * @template E */ interface Result { // … public function unwrap() }
readonly class Err implements Result { // ... /** * @return E */ public function unwrapErr() { return $this->value; } } /** * @template T * @implements Result<T, never> */ final readonly class Ok implements Result { // … } /** * @template T * @template E */ interface Result { // … }
readonly class Err implements Result { // ... /** * @return E */ public function unwrapErr() { return $this->value; } } /** * @template T * @implements Result<T, never> */ final readonly class Ok implements Result { // … /** * @return never */ public function unwrapErr() { throw new LogicException('called Result->unwrapErr() on an ok value'); } } /** * @template T * @template E */ interface Result { // … public function unwrapErr() }