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 类型,这个迁移只是资源到对象迁移计划的一部分。改变扩展空命名间
该迁移遵循 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
函数的已有代码现在需要考虑在 PHP 8.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 连接资源,这可能会是一个向后兼容性问题。