PHP 8.1 - FTP 扩展:连接资源使用 FTP\Connection 类对象
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连接资源,这可能会是一个向后兼容性问题。