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

在哪里关闭在PHP脚本开头打开的文件句柄?,php,fopen,file-handling,filehandle,fclose,Php,Fopen,File Handling,Filehandle,Fclose,我有一个PHP文件,在上面我使用fopen()创建了一个文件句柄。然后文件有两个类,在这些类的函数中,我向这个文本文件写入内容。最后,也就是说,当我向这个文件写完东西后,我必须使用fclose()关闭这个文件句柄 控制流是这样的,在下面的伪代码中,类a的函数a_b()在这个PHP脚本中被最后调用。因此,很自然地,在a_b()正文的末尾,我决定编写fclose($fileHandle) 但是我得到了一个错误:注意:未定义的变量:第15行的C:\xampp\htdocs\Tests\Test.php

我有一个PHP文件,在上面我使用
fopen()
创建了一个文件句柄。然后文件有两个类,在这些类的函数中,我向这个文本文件写入内容。最后,也就是说,当我向这个文件写完东西后,我必须使用
fclose()
关闭这个文件句柄

控制流是这样的,在下面的伪代码中,类
a
的函数
a_b()
在这个PHP脚本中被最后调用。因此,很自然地,在
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");
    ...
  }
}

?>

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

默认情况下,PHP函数无法访问全局变量。因此:

$value = 'hello world';
class A {
    public function b () {
        return $value;
    }
}
…不起作用-
$value
在函数中不可用

使用关键字使函数中的全局变量可用:

$value = 'hello world';
class A {
    public function b () {
        global $value;
        return $value;
    }
}
但是,正如评论者所建议的,如果可能的话,最好将
$fileHandle
变量保留在使用它的类中,并尽快关闭句柄。

将内联代码(即做某事的代码,而不是定义稍后调用的代码)混合在同一文件中,-不仅仅是因为它会引起你在这里描述的那种问题

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

如果您想做的不仅仅是关闭文件,那么在执行线程中显式调用关闭的另一种方法是让PHP执行(请注意,回调也可以是一个对象,即带有关联数据的对象)


正如Renee指出的,您的问题源于范围。然而,将文件操作分为两个不同的类也是一种糟糕的设计,并且会产生程序上的副作用。使用单个类定义所有文件操作(打开、关闭、读取、写入)。然后将对该类的引用传递给其他类,这些类将向文件提供或需要数据。

为什么不在方法内部打开和关闭?有理由不这样做吗?@RajeshPaudel说了什么。还有,哪一行是第15行?@DimitrisDamilos
fclose($fileHandle)-那个是第行15@RajeshPaudel没有,没有什么特别的原因,但是这个问题的答案会让我更好地理解控制流=)类中的变量是什么类型的
$fileHandle
?它是公开的,所以所有功能都可以访问它吗?