axy/posix

POSIX函数的Mock包装器

0.2.0 2024-01-20 12:01 UTC

This package is auto-updated.

Last update: 2024-09-20 13:54:19 UTC


README

POSIX函数的Mock包装器。

Latest Stable Version Minimum PHP Version Tests Coverage Status License

该库提供了接口axy\posix\IPosix,几乎完全重现了POSIX函数列表。还提供了标准实现。这是RealPosix类,它仅将执行委托给这些函数。

使用它的好处是什么?除了下面提到的少量改进外,使用具有指定接口的对象允许您更改实现。首先,这对于测试很有用。《RealPosix》本身提供了监听功能(见下文)。

IPosix

该接口包含类似于标准posix_*()函数的方法。

  • 方法名称不包含前缀posix_。否则,名称完全相同。它们可以被更改为更易读的风格,但这是标准,您知道的。
  • 发生错误时抛出异常(标准函数通常返回FALSE)。
  • 出于同样的原因,没有用于获取最后一个错误代码的方法。
  • 某些方法返回的结构(例如getgrgid())被转换为特定数据类的对象(标准函数返回关联数组)。

异常

位于axy\posix\exceptions

  • IPosixException - 主要接口
    • PosixException - 标准函数错误(扩展LogicException,仅此而已)
      • 构造函数仅接受一个错误代码作为参数
      • 异常对象具有只读属性
        • $posixErrorCode (int) - 原始错误代码,等于异常代码
        • $posixErrorConstant (?string) - 错误常量名称(例如,EPERM,如果未定义则为NULL)
        • $posixErrorMessage (string) - 错误消息,如posix_strerror()返回
    • PosixNotImplementedException - 对应的函数未定义(例如,getpgid在所有系统上均未定义,一些函数在8.3中添加)

结构

所有以下结构都是数据类。每个类都有一个属性$data,它包含原始数组和该数组的其他命名属性。

  • PosicUserInfo - 由getpwnam()getpwuid()返回
  • PosixGroupInfo - 由getgrgid()getgrnam()返回
  • PosixTimesInfo - 由times()返回
  • PosixUnameInfo - 由uname()返回
  • PosixResourceLimits - 由getrlimits()返回,包含两个子对象hardsoft,结构与它们类似

常量

所有用作方法参数的常量都收集在PosixConstants类中。这些只是标准常量的副本(不带前缀POSIX_)。PHP版本允许在IPosix中收集这些,但这会使得接口因很少使用的元素而变得杂乱。

错误代码

错误代码常量收集在PosixErrors中。有一个方法PosixErrors::getConstName(int $code): ?string,它返回一个代码的常量名称。

监听器

RealPosix的监听器允许创建记录器或简单的Mock。

$posix = new RealPosix($listener);

监听器必须实现axy\posix\IPosixListener或扩展PosixListener。有两种方法

  • before(string $method, array $args, ?int &$code = null): mixed
  • after(string $method, array $args, mixed $result, ?int &$code = null): mixed

before() 在实际函数调用之前被调用。它接受方法名(如 "getgid",不包含前缀)和参数列表。如果它返回除了 NULL 以外的任何值,则被视为结果,并且不会调用实际函数。

after() 分别在性能结束时调用,并接受 $result(作为性能结果,它也可以是 before() 的结果)。它可以改变结果并返回它。如果您不想在这里更改结果,只需返回 $result 参数。

  • 两种方法都必须以标准函数格式返回值。对于 getgrgid(),它是一个数组,而不是数据对象。
  • 方法必须遵循返回值类型。如果它们在需要 string 时返回 int,将导致致命错误。
  • 为了指示错误,它们可以抛出 PosixException 或返回该情况的标准值(通常是 FALSE 或 -1)。
  • 两种方法都通过链接接受 $code 并可以更改它。如果检测到错误,它将用作错误代码。before() 将它作为 NULL 接收,after() 接收 before() 更改的或实际的错误代码。如果发生错误且 $code 没有被监听者更改,将使用 posix_get_last_error() 的实际代码。