jonathanr/php-optional-result

1.0.6 2024-07-30 10:56 UTC

This package is auto-updated.

Last update: 2024-09-30 11:20:46 UTC


README

此包是Rust返回响应的实现。

用法

查看示例目录

可选响应

当需要返回可能为null的值时,可以使用Option::class

带值的返回

  • Option::some('AnyValue')
  • Option::some(10)
  • Option::some(['one', 'two', 'three'])

您可以用任何需要的值替换参数。

无返回值

  • Option::none()

允许的方法

$value = Option::some('any value')

$value->isSome()返回布尔值 $value->isNone()返回布尔值

Get()方法

  • Get方法在返回Some时返回值

  • Get方法在返回None时抛出NoneException异常

结果响应

当需要返回一个说明过程是否成功或出现错误的对象时,可以使用Result::class

带值的返回OK

  • Result::ok('anyValue')
  • Result::ok(10)
  • Result::ok([1, 2, 3])

您可以用任何需要的值替换参数,也可以用Option::class替换

带消息的返回Error
  • Result::err('an error occur')

Get方法

  • Get方法在返回Ok时返回值
  • Get方法在返回Err时返回错误值

要获取错误消息,可以使用getError()方法

示例(请参阅示例目录

之前


/**
* @return string
*/
function askDomain(string $name): ?String
{
  try {
      $json = Http::get('myResolverApi?name='.$name)->json();
      if (isset($json['domain']) && ($json['domain'] !== null || $json['domain'] !== '')) {
      return $json['domain'];
      }
      return null;

  } catch (HttpException) {
    throw new Exception('API No respond');
  }
}

function isDomainExist(string $name): string
{
    try {
        $result = askDomain($name);

        if (!empty($result)) {
            return 'domain is' . $result; 
        }
        
    } catch (Exception $e) {
        return '';
    }
}


echo isDomainExist('goooooooooooogle');

之后


/**
* @return Ok<Some<string>|None>|Err<None>
*/
function askDomain(string $name): Ok|Err
{
    try {
        $json = Http::get('myResolverApi?name='.$name)->json();
        if (isset($json['domain'])) {
            return Result::ok(Option::some($json['domain']));
        }
    
       return Result::ok(Option::none());
    
    } catch (HttpException) {
    return Result::Err(Option::none());
    }
}

function isDomainExist(string $name): string
{
    $result = askDomain($name);

    if ($result->isErr()) {
        return 'Not sure. API not respond';
    }

    if ($result->isOk() && $result->get()->isSome()) {
        return 'domain is'.$result->get()->isSome()->get();
    }

    return 'domain does not exist';
}


echo isDomainExist('goooooooooooogle');