[浅出 PHP] PHP 文件操作 写文件
什么是浅出?
就是用最简单的话,来解释最简单的事儿。
fwrite函数
写入文件(可安全用于二进制文件)。
老铁你好奇什么是二进制安全吗?php-src这个项目是c语言写的,在c语言中,是没有字符串类型的。c语言实现的字符串是用char数组,然后以'\0'作为字符串的结束。所以读到了'\0'的时候,就结束了不读了。但是在php中,读到了'\0'却没有结束。这就是二进制安全。
老铁你好奇在php-src是怎么实现二进制安全的?php的字符串实现,把字符串的长度(len)记录了。
读的时候按照长度来读,就二进制安全了。
fwrite的参数
handle
文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
这里忍不住唠叨一下,有些翻译把handle翻译为句柄。这个专业术语,好难懂!!!
但是我结合上下文,把句柄理解为入口的意思。各位大神,你们怎么看?
文件系统指针,指针是什么?指向一个变量的内存地址。(是不是很浅出?)
string
要写的字符串。
注意哦,这个字符串很安全噢,因为这是个二进制安全的fwrite。(这句话忽视吧)
length
如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。
这下面是英文文档,上面是官方手册的中文翻译,我复制的。
If the
length
argument is given, writing will stop afterlength
bytes have been written or the end ofstring
is reached, whichever comes first.
fwrite的返回值
fwrite() 返回写入的字符数,出现错误时则返回
FALSE
要不浅出的看下源码?
既然是浅出,我就很浅的看了一下变量啊。
char *str; //这是要写入的字符串
size_t str_len; //这是字符串的长度
zend_long length = 0;
ssize_t written; //这是返回的写入字符数
老铁你好奇,为什么written不等于str_len吗?因为fwrite的第三个参数是可以指定要写入的字符串长度的。我字符串如果长度10,但是length是3,写入成功的情况下是返回3的。
老铁你好奇,为什么字符串长度是size_t,而返回的长度是ssize_t吗?size_t是无符号的,ssize_t是有符号的。size_t不会给你返回负数,因为一个字符串长度永远不可能是一个负数。那么返回的字符数为什么是有符号的啊?刚才说了c语言没有字符串类型,c语言有的东西太少了。布尔类型c语言也没有的,所以很多时候就用负数来代表false了。注意哦,fwrite的返回值再出错的时候要返回false。
老铁你好奇,别好奇了,
申明
以上信息不保证完全正确,因为是人都会犯错。不过很乐意各位大佬指点,谢谢。
本作品采用《CC 协议》,转载必须注明作者和本文链接
语言描述很生动有趣😄