什麼是淺出?
就是用最簡單的話,來解釋最簡單的事兒。
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。
老鐵你好奇,別好奇了,
申明
以上資訊不保證完全正確,因為是人都會犯錯。不過很樂意各位大佬指點,謝謝。