在哪里关闭在 PHP 脚本开头打开的文件句柄?

Where to close a file handle opened at the beginning of a PHP script?

我有一个 PHP 文件,我在其中的顶部使用 fopen() 创建了一个文件句柄。然后文件有几个 classes,在这些函数中我将内容写入此文本文件。最后,即当我完成向该文件写入内容后,我必须使用 fclose().

关闭该文件句柄

控制流是这样的,在下面的伪代码中,class A 的函数 a_b() 在这个 PHP 中被称为 LAST OF ALL脚本。所以,很自然地,在a_b()的正文末尾,我决定写fclose($fileHandle);

但我得到一个错误:注意:未定义的变量:C:\xampp\htdocs\Tests\Test.php 中的文件句柄在第 15 行

问题是为什么? fclose($fileHandle)语句应该写在哪里?我应该把它写在文件的最后吗?

<?php 

$fileHandle = fopen($pathToFileHandle, "a");

class A {
  function a_a() {
    ...
    fwrite($fileHandle, "blahBlahBlah");
  }

  function a_b() {
    ...
    fwrite($fileHandle, "Whatever");
    ...
    fclose($fileHandle);
  }
}

class L {
  function l_a() {
    ...
    fwrite($fileHandle, "Some text");
    ...
  }
}

?>

Undefined variable: fileHandle in C:\xampp\htdocs\Tests\Test.php on line 15

PHP 函数默认不能访问全局变量。所以:

$value = 'hello world';
class A {
    public function b () {
        return $value;
    }
}

…不起作用—$value 在函数中不可用。

使用 global 关键字使全局变量在函数内可用:

$value = 'hello world';
class A {
    public function b () {
        global $value;
        return $value;
    }
}

但是,正如评论者所建议的那样,如果可能的话,最好将 $fileHandle 变量保留在使用它的 class 中并尽快关闭句柄。

将内联代码(即执行某些操作的代码而不是定义稍后调用的内容的代码)混合在同一个文件中,is considered a bad thing - 尤其是因为它会引起您描述的那种问题这里。

您不需要明确关闭文件句柄 - PHP 将在脚本退出时自动执行此操作。

如果你想做的不仅仅是关闭文件,在你的执行线程中显式调用关闭的另一种方法是请求 PHP 到 call a function when the script finishes executing(注意回调也可以是一个对象 - 即具有关联数据)。

正如 Renee 指出的那样,您的问题出在范围上。然而,将文件操作拆分为两个不同的 classes 和程序副作用的设计也很糟糕。使用单个 class 定义所有文件操作(打开、关闭、读取、写入)。然后将对该 class 的引用传递给其他 class 将提供或需要数据 to/from 文件的其他 classes。