编程

PHP 8.1 - FTP 扩展:连接资源使用 FTP\Connection 类对象

511 2023-04-25 02:26:00

ftp 扩展的 FTP 连接资源迁移到 PHP 8.1 的类对象上。

在 PHP 8.1 之前,FTP 连接使用 ftp_connect() 和 ftp_ssl_connect() 函数创建,这些函数返回一个类型为 ftp 的资源(resource)。在 PHP 8.1 以后,这些函数返回一个 FTP\Connection 类实例。

所有之前接受资源类型参数的函数,现在也接受新类型。

资源到对象的迁移
PHP 正在使用类对象逐步淘汰所有resource类型,这个迁移只是资源到对象迁移计划的一部分。

Extension Namespace Changes扩展空间改变
该迁移遵循PHP新提出的将命名空间用于捆绑扩展的规范.

FTP\Connection 类摘要

namespace FTP;
final class Connection {}

类似于其他资源到类的迁移,新增的 FTP\Connection 类声明为final,以避免被继承(并减少潜在的向后兼容性问题,如果PHP内核改变 FTP\Connection 类方法的话)。

不允许实例化一个 FTP\Connection 新实例,会导致 \Error 异常。

new FTP\Connection();
Cannot directly construct FTP\Connection, use ftp_connect() or ftp_ssl_connect() instead

is_resource 检测

处理ftp资源的用户空间PHP代码有时候会使用 is_resource 函数检测资源对象是否有效。

这一操作不是必须的,因为 ftp_connect 和 ftp_ssl_connect 函数在碰到错误时返回 false。该模式在PHP 8.1 中也将继续维护。

要检测 FTP 资源的创建是否成功,检测是否返回 false 是跨版本兼容方案,和 is_resource 检测一样准去。

依赖于 is_resource 函数的已有代码现在需要考虑在 PHP8.1中的 FTP\Connection 类对象。

- is_resource($ftp_connection)
+ is_resource($ftp_connection) || $ftp_connection instanceof \FTP\Connection

此外,检测是否为 false,可能更为合适且更为可读。

- is_resource($ftp_connection)
+ $ftp_connection !== false

销毁 FTP\Connection 对象

销毁一个 FTP\Connection 对象,或者将其丢给gc去清理,会自动关闭 FTP 连接。

当然也可以使用 ftp_close 函数显式关闭 FTP 连接。该函数未被废弃,仍然可用。

尝试使用已关闭的 FTP 连接对象会抛出 ValueError 异常。

ValueError: FTP\Connection is already closed

向后兼容性影响

与其他资源到对象的迁移类似,FTP扩展无缝升级将返回和接受的参数类型到新的基于对象的资源。

is_resource函数现在为FTP连接对象返回false,而不是以前的true返回值。如果使用该功能检查FTP连接资源,这可能会是一个向后兼容性问题。