首页 > 解决方案 > 哪些函数 PHP 被认为不是“二进制安全的”?这些“非二进制安全”函数将字符串传递给哪些库?为什么?

问题描述

我正在使用Windows 10 Home Single Language Edition,它是我机器上的64 位操作系统

我已经安装了最新版本的XAMPP ,它在我的机器上安装了PHP 7.2.7 。

我是根据摘自PHP Manual的摘录来问这个问题的:

PHP 中的字符串被实现为一个字节数组和一个指示缓冲区长度的整数。它没有关于这些字节如何转换为字符的信息,将任务留给程序员。字符串可以包含的值没有限制;特别是,值 0 的字节(“NUL 字节”)允许在字符串中的任何位置(但是,一些函数,在本手册中说不是“二进制安全的”,可能会将字符串移交给忽略数据后的库NUL 字节。)

我非常了解 PHP 中二进制安全函数和非二进制安全函数之间的区别。我一直在心里怀疑。请用适当的解释和适当的例子一一回答。

标签: phpstringphp-internals

解决方案


就像 arkascha 解释的那样,“二进制安全”和“非二进制安全”的问题与语言无关。

使用空字节 (0x00) 来指示字符串的结尾更简单(这可能是 C 使用它的原因),但缺点是字符串中的任何地方都不能有空字节,如果你这样做,这是一个很大的限制必须能够处理各种数据。将长度存储为字符串的元数据部分更为复杂,如 Pete 所示,但它允许您处理任何类型的数据。

关于哪些函数是“二进制安全”或“非二进制安全”的,请在使用这些函数之前阅读 PHP 手册。我就是做这个的。无需构建列表,因为 PHP 手册已经解释了您需要了解的有关函数的内容,包括它们是否是二进制安全的。

我相信您的大部分帖子是由于对您引用的 PHP 手册的解释的误解,特别是这部分:

但是,本手册中提到的一些函数不是“二进制安全的”,可能会将字符串移交给忽略 NUL 字节后数据的库。

让我尝试通过添加一些我自己的话使其更清楚:

但是,本手册中提到的一些函数不是“二进制安全的”,它们可能会将字符串移交给忽略 NUL 字节后数据的库。

所以它真的没有说“非二进制安全函数将字符串交给库”,这是一种误解。它的意思是“可能将字符串传递给在 NUL 字节后忽略数据的库的函数,在本手册中被称为不是二进制安全的”。

“移交给库”只是“从其他库调用函数”的另一种说法。“在 NUL 字节后忽略数据”是一种称为非二进制安全的行为。

另一种说法是:

本手册中的一些函数被称为不是“二进制安全的” ,因为它们可能会调用其他也不是“二进制安全”的函数(忽略 NUL 字节后数据的函数)。

我希望这可以为您解决问题。


推荐阅读