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

时间:2017-09-12 10:52:25

标签: php fopen file-handling filehandle fclose

我有一个PHP文件,在顶部我使用fopen()创建文件句柄。然后文件有几个类,我在这个函数中写东西给这个文本文件。最后,最后,即当我完成向此文件写入内容时,我必须使用fclose()关闭此文件句柄。

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

但是我得到了一个错误:注意:未定义的变量:第15行的C:\ xampp \ htdocs \ Tests \ Test.php中的fileHandle

问题是为什么?我应该在哪里写下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");
    ...
  }
}

?>

2 个答案:

答案 0 :(得分:1)

  

未定义的变量:第15行的C:\ xampp \ htdocs \ Tests \ Test.php中的fileHandle

默认情况下,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变量保留在使用它的类中,并尽快关闭句柄。

答案 1 :(得分:1)

使用内联代码(即执行某些操作的代码,而不是稍后调用某些内容的代码)混合在同一个文件is considered a bad thing中 - 不仅仅是因为它会引起您在此处描述的问题。

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

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

正如蕾妮所指出的那样,你的问题来自范围。然而,它也是糟糕的设计,将文件操作分成两个不同的类和程序性副作用。使用单个类来定义所有文件操作(打开,关闭,读取,写入)。然后将对该类的引用传递给其他类,这些类将向文件提供数据或从文件中获取数据。