axy / posix
POSIX函数的Mock包装器
Requires
- php: >=8.1
- ext-posix: *
Requires (Dev)
- axy/pkg-unit: ~0.1.3
- squizlabs/php_codesniffer: =3.7.1
This package is auto-updated.
Last update: 2024-09-20 13:54:19 UTC
README
POSIX函数的Mock包装器。
该库提供了接口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()
返回,包含两个子对象hard
和soft
,结构与它们类似
常量
所有用作方法参数的常量都收集在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()
的实际代码。