【问题标题】:Where to close a file handle opened at the beginning of a PHP script?在哪里关闭在 PHP 脚本开头打开的文件句柄?
【发布时间】:2017-09-12 10:52:25
【问题描述】:

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

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

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

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

?>

【问题讨论】:

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

标签: php fopen file-handling filehandle fclose


【解决方案1】:

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

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

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

正如 Renee 所指出的,您的问题来自范围。然而,将文件操作拆分到两个不同的类和程序上的副作用也是不好的设计。使用单个类来定义所有文件操作(打开、关闭、读取、写入)。然后将对该类的引用传递给其他类,这些类将向/从文件提供或需要数据。

【讨论】:

    【解决方案2】:

    未定义变量:第 15 行 C:\xampp\htdocs\Tests\Test.php 中的文件句柄

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2012-04-24
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多