我有一个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");
...
}
}
?>
答案 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(注意回调也可以是一个对象 - 即相关数据)。
正如蕾妮所指出的那样,你的问题来自范围。然而,它也是糟糕的设计,将文件操作分成两个不同的类和程序性副作用。使用单个类来定义所有文件操作(打开,关闭,读取,写入)。然后将对该类的引用传递给其他类,这些类将向文件提供数据或从文件中获取数据。