[浅出 PHP] PHP 文件操作 写文件

什么是浅出?

就是用最简单的话,来解释最简单的事儿。

fwrite函数

写入文件(可安全用于二进制文件)。

老铁你好奇什么是二进制安全吗?php-src这个项目是c语言写的,在c语言中,是没有字符串类型的。c语言实现的字符串是用char数组,然后以'\0'作为字符串的结束。所以读到了'\0'的时候,就结束了不读了。但是在php中,读到了'\0'却没有结束。这就是二进制安全。
老铁你好奇在php-src是怎么实现二进制安全的?php的字符串实现,把字符串的长度(len)记录了。

【浅出php】php文件操作 写文件

读的时候按照长度来读,就二进制安全了。

fwrite的参数

handle

文件系统指针,是典型地由 fopen() 创建的 resource(资源)。

这里忍不住唠叨一下,有些翻译把handle翻译为句柄。这个专业术语,好难懂!!!
【浅出php】php文件操作 写文件

但是我结合上下文,把句柄理解为入口的意思。各位大神,你们怎么看?
文件系统指针,指针是什么?指向一个变量的内存地址。(是不是很浅出?)

string

要写的字符串。

注意哦,这个字符串很安全噢,因为这是个二进制安全的fwrite。(这句话忽视吧)

length

如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。

这下面是英文文档,上面是官方手册的中文翻译,我复制的。

If the length argument is given, writing will stop after length bytes have been written or the end of string is reached, whichever comes first.

fwrite的返回值

fwrite() 返回写入的字符数,出现错误时则返回 FALSE

要不浅出的看下源码?

【浅出php】php文件操作 写文件

既然是浅出,我就很浅的看了一下变量啊。

    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。
老铁你好奇,别好奇了,

【浅出php】php文件操作 写文件

申明

以上信息不保证完全正确,因为是人都会犯错。不过很乐意各位大佬指点,谢谢。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

语言描述很生动有趣😄

5年前 评论
L学习不停 (楼主) 5年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!