infomaniac-amf / php
InfomaniacAMF 是一个用于 AMF 数据包的 (反)序列化 PHP 项目
Requires
- php: >=5.4
This package is not auto-updated.
Last update: 2024-09-28 15:28:56 UTC
README
简介
AMF (Action Message Format) 是一种二进制数据序列化协议。简单来说,它将内存中的对象转换为二进制字符串,并且可以将这个二进制字符串转换回内存中的对象。它可以像 JSON
一样使用,并且这个库旨在提供与 PHP
中 JSON
功能类似的 API。
用途
该库的目的是在 PHP
和 JSON
中提供对 AMF
规范的一致且对称的实现。
为什么使用 AMF?
这取决于你。 JSON
完全适合于网络,但它确实有一些由 AMF
解决的缺点。首先,JSON
无法处理具有循环引用的复杂对象图;此外,它无法序列化日期和字节数组 - 你需要在 JSON
中进行一些额外的工作来支持这些(将日期转换为 Unix 时间戳,将字节数组转换为 base64)。
我应该停止使用 JSON 吗?
当然不。 JSON
很好;AMF
可以为你提供一些额外的功能,这些功能可以帮助你构建你的 Web 应用程序。
入门
要开始使用此库,您需要通过 Composer 安装它
{ "require": { "infomaniac-amf/php": "dev-master" } }
一旦您运行了 composer install
,您就可以通过包含 Composer 的自动加载器来使用库
<?php require_once 'vendor/autoload.php';
用法
以下是将数组编码为 AMF
的简单示例
<?php require_once 'vendor/autoload.php'; $data = array( 'any' => 'data', 'you' => 'like' ); header('Content-Type: application/x-amf'); echo amf_encode($data);
这将产生一个表示您提供的数据的二进制字符串。
如果您使用工具(如 Charles Proxy)检查生成 AMF
数据的页面的 HTTP 流量,您将看到以下输出
要解码此字符串,只需执行以下操作
$data = array( 'any' => 'data', 'you' => 'like' ); $encodedData = amf_encode($data); $data = amf_decode($encodedData);
如果您使用 var_dump
检查此数据,它将看起来与提供给 amf_encode
函数的输入数据完全相同。
array (size=2)
'any' => string 'data' (length=4)
'you' => string 'like' (length=4)
额外功能
类映射
AMF
允许您编码一个对象并保留一些关于它的元数据;例如,在序列化类的实例(不是 stdClass
)时,库将保留类的完全限定命名空间名称,并在解码时使用它来重建该类型的对象。
考虑以下类
<?php class Person { public $name; }
如果我们编码此对象的实例,默认情况下,它的类类型将被忽略,并且在解码数据时,结果值将是一个普通的 PHP stdClass
实例。
这是在 Charles 中编码数据的模样
为了在 AMF
中保留类类型,您需要在 amf_encode
函数调用中添加一个额外的标志
amf_encode($data, AMF_CLASS_MAPPING);
当提供 AMF_CLASS_MAPPING
标志时,编码数据在 Charles 中的外观将如下所示
注意此响应中添加的 Person
元数据
现在,当此数据被解码时,库将尝试创建一个新的 Person
类实例,并将其公共属性 name
设置为 "bob"
。
object(Person)[8] public 'name' => string 'bob' (length=3)
数据编码(序列化)
AMF
规范允许序列化多种不同的数据类型。
以下是最新的规范链接: AMF3 Spec - January 2013
这个库实现了规范中描述的 10 种数据类型中的 18 种。只支持这些类型的子集的原因可以从两个方面来理解:实用性 和 局限性。以下是可用的数据类型的详尽列表:
许可证
本项目采用 MIT
许可证授权。
致谢
在编写这个库的过程中,我使用了几个库来验证我的进度,并帮助我解决问题。我想特别感谢以下库和个人
- SabreAMF
- AmfPhp
- Charles Proxy 的出色 AMF 实现
- 感谢 neoxic 的 Arseny Vakhrushev 的耐心、指导、建议和帮助
- 感谢 Robert Cesaric、Grant McMullin 和 Andre Venter 提供的见解和建议
- 在 Zando 的尊敬的同事们