php8.0 fwriteでエラー「 Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, bool given in」が発生する

php8.0  fwriteでエラー「 Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, bool given in」が発生する

phpで、fwriteでエラー「 Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, bool given in」が発生する原因と対象法を記述してます。

環境

  • OS  CentOS Stream release 8
  • php 8.0.0
  • nginx 1.14.1

エラー内容

以下のコードを実行時に発生。

<?php
// hoge.txtは存在しない
$file = fopen('hoge.txt', 'r+');

var_dump($file); // bool(false)

fwrite($file, 'hello world');
rewind($file);

fclose($file);

エラー全文

PHP Fatal error:  Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, bool given in /usr/share/nginx/html/sample.php:7
Stack trace:

7.4.5ではwarningとなります。

PHP Fatal error:  Uncaught TypeError: fwrite(): Argument #1 ($stream) must be of type resource, bool given in /usr/share/nginx/html/sample.php:7
Stack trace:

原因

型が違うため、php8ではエラーとなってしまう。

対処法

当然ですが、hoge.txtを作成すれば、エラーは解消します。

<?php

touch('hoge.txt');

$file = fopen('hoge.txt', 'r+');

var_dump($file); // resource(5) of type (stream)

fwrite($file, 'hello world');
rewind($file);

echo fread($file, filesize('hoge.txt')); // hello world

fclose($file);