编程语言
首页 > 编程语言> > PHP被称为“二进制安全”的功能是什么?这些“非二进制安全”函数向哪些库移除字符串?为什么?

PHP被称为“二进制安全”的功能是什么?这些“非二进制安全”函数向哪些库移除字符串?为什么?

作者:互联网

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

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

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

The string in PHP is implemented as an array of bytes and an integer
indicating the length of the buffer. It has no information about how
those bytes translate to characters, leaving that task to the
programmer. There are no limitations on the values the string can be
composed of; in particular, bytes with value 0 (“NUL bytes”) are
allowed anywhere in the string (however, a few functions, said in this
manual not to be “binary safe”, may hand off the strings to libraries
that ignore data after a NUL byte.)

我非常理解PHP中二进制安全函数和非二进制安全函数之间的区别.我心中怀疑.请以一对一的方式回答它们,并附上适当的解释和适当的例子.

> PHP中是否存在“非二进制安全”和“二进制安全”函数的现象,因为整个PHP解析器都是用C语言编写的?
>在处理包含任何值的字符串(包括NUL字节)时,C和PHP之间有什么区别?
>我想要PHP中的完整功能列表,这些功能是“非二进制安全的”,并且是“二进制安全的”.
>“非二进制安全”和“二进制安全”的特性是否仅适用于操作字符串的函数,不适用于处理PHP中其他类型的PHP函数?
>为什么非二进制安全函数将字符串移交给库?
>只有当它们处理的字符串包含NUL字节时,非二进制安全函数才会将字符串移交给库吗?
>这些“非二进制安全”功能将这些字符串移交给哪些库?
>这些库如何处理从“非二进制安全”函数接收的字符串?
>在将包含NUL字节的字符串移交给某个库之后,“非二进制安全”函数是否像“二进制安全”函数一样工作?

解决方法:

像arkascha解释的那样,“二元安全”和“非二元安全”问题与语言无关.

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

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

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

however, a few functions, said in this manual not to be “binary safe”, may hand off the strings to libraries that ignore data after a NUL byte.

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

however, a few functions, said in this manual not to be “binary safe”, are the functions that may hand off the strings to libraries that ignore data after a NUL byte.

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

“移交给图书馆”只是说“从其他图书馆调用功能”的另一种方式.
“忽略NUL字节后的数据”是一种被称为非二进制安全的行为.

另一种方式是:

A few functions in this manual are said not to be “binary safe” because they may call other functions that are also not “binary safe” (functions that ignore data after a NUL byte).

我希望这能为你解决这个问题.

标签:php-internals,php,string
来源: https://codeday.me/bug/20190910/1801172.html