PHP 中的返回数据是否始终为字符串?

Is a returned data in PHP always a string?

我正在使用下面的 PHP 函数获取数据 - 返回的数据始终是字符串还是也可以是数组?

function getData($xPostURL,$xToken,$xTokenSecret,$xAccount)
{ 
    $datatopost = array (
        "token" =>  $xToken,
        "tokenSecret" => $xTokenSecret,
        "account" => $xAccount,
    );

    $ch = curl_init ($xPostURL);
    curl_setopt ($ch, CURLOPT_POST, true);  
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $datatopost);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
    $returnedData = curl_exec ($ch);

    echo $returnedData;
}

getData("http://www.example.com/foo.php","","","");

下面是 foo.php 数据是如何通过 print_r() 返回的:

print_r($myArray);

数组如下所示:

Array
(
    [0] => hello
    [1] => world
    [2] => xyz
)

curl返回的数据永远是一个字符串。 HTTP 仅适用于文本,它无法传输任何其他内容。 curl 不会将此文本解释为其他任何内容。

如果 foo.php 通过调用 print_r() 产生输出,那么这就是另一个脚本(使用 curl 的脚本)得到的结果。 IE。一个看起来像 print_r() 的输出的字符串。

如果你想要 foo.php return 一个数组,那么你需要更改 foo.php 以将此数组表示为字符串并输出该字符串,然后在客户端代码中解析字符串表示在内存中重建数组的数组。

PHP 中有很多方法可以生成数据结构的字符串表示形式。 JSON 是最好的(在我看来),XML 也可以使用,内部 PHP 序列化也可以(它是唯一可以存储和重新创建嵌入递归引用的对象的), var_export()也可以做到

快速列表:

  • JSON:使用json_encode() to encode the data in foo.php; use json_decode() to analyze the string (returned by curl_exec()) and re-create the data structure at the other end; pass TRUE as the second argument to json_decode() to get an array, otherwise it will produce a PHP object.

    优点[+]和缺点[-]

    • [+] 它是标准表示,其他编程语言(直接由语言或其某些库)很好理解;
    • [+] 它产生尽可能短的文本表示;
    • [+]编码和解码非常简单:都需要一次调用正确的函数;
    • [+]这也是最快的方法,无论是编码还是解码;
  • XML:使用SimpleXML classes and functions to create the XML object then iteratively add the data to it. Call method SimpleXMLElement::asXML() to create the text representation of the XML and output it. Then use simplexml_load_string() or the myriad of methods of class SimpleXML从中提取数据。

    • [+] XML 格式是标准化的,非常流行,并受到许多其他编程语言的支持;
    • [+]可用于传输大型数据结构;
    • [+] 解析可以增量完成,只提取需要的数据;无需在内存中重新创建整个结构;
    • [-]编码和解码都需要很多代码;
    • [-]文字表示大;对于包含小字符串的数据结构,它通常比等效的 JSON;
    • 大 2 倍左右
    • [-]编码和解码速度也很差(这是这里介绍的最差的方法);
  • PHP 序列化:使用PHP函数serialize() to represent the data structure as string; use function unserialize()解析字符串并重新创建PHP 数据结构。

    • [+]文字表示的长度不是很大;它比 JSON 稍大,但不是很大;
    • [+] 它可以处理(编码和解码)包含循环引用的数据结构(其他方法无法做到);
    • [+]它可以处理对象(OOP);在重建时,它需要知道文本中使用的 类 的定义或加载它们的方法;
    • [+]编码和解码的速度都比json_encode()/json_decode()略差,但并不明显;
    • [-]是PHP的内部表示。没有其他语言可以现成地理解它;需要编写解析器来分析文本表示并恢复数据结构(但这是一项容易的工作,格式很简单)。
  • http_build_query():这只能用于包含标量值的数组。使用函数 http_build_query() to produce the string representation of the input data (an array). Use function parse_str() 解析字符串并重新创建原始数组。

    • [+] http_build_query() 生成的字符串是一个 URL 编码的查询字符串,这是在网页之间传递数据的标准方式。它可以很容易地用用于 Web 开发的语言解码,也可以用其他语言解码;
    • [+] 它产生最短的文本表示,因为它不对值的类型进行编码...
    • [-] ...但这会强制重新创建的数组中的值是字符串;无法恢复原始类型(因为它们在编码时丢失);
  • var_export():PHP 函数 var_export() 生成的 PHP 代码可以用于生成内存中的数据结构; 运行宁该代码可以重建数据结构。

    [+]输出正确的PHP代码;它可以很容易地被人检查和修改; [+] 数据恢复可能是此处介绍的所有方法中最快的,但风险(见下文)与收益不匹配(无论如何,这是无关紧要的); [-] 因为重建是通过 运行 宁或评估 PHP 代码完成的,它可以代表 运行 的代码做任何事情; [-] 运行从另一台服务器下载的宁代码是一个非常严重的安全问题;即使您控制了另一台服务器,恶意黑客也可以使用不同的技术将您的请求转移到他们控制的服务器,或者将一些额外的代码附加到另一台服务器生成的代码中;黑客生成的代码将在您的服务器上执行,从那一刻起您的服务器就不再属于您了; 从不 运行 自动从另一台服务器下载代码!

结论

有许多方法可以将数据结构从一个 运行 在服务器上的一个脚本传输到另一个 运行 在另一台服务器上的脚本。最好的(在我看来)是 JSON 其次是 XML。它们具有可移植性的优势,并且也受到其他语言的良好支持。 JSON 快速、小巧且易于使用。 XML 更难使用,但这是因为它非常灵活,可以通过多种方式进行处理。

PHP 序列化也是 JSON 的一个很好的替代方法,如果您不需要与不 运行 PHP 和 JSON帮不了你。

此处描述的其他选项仅用于教育目的。

永不 运行 或自动评估从其他网站下载的代码。