我试图在对象实例化上创建一个文件,并在对象销毁时创建另一个文件.
这是代码:
class Foo{
public function __construct(){
file_put_contents('a_construct.txt', 'c');
}
public function __destruct(){
file_put_contents('a_destruct.txt', 'd');
}
}
通常会创建a_construct.txt文件.但是当涉及到创建a_destruct.txt文件时,它表现得非常奇怪.
如果我运行以下代码,则不会创建“a_destruct”文件.
$foo = new Foo();
我收到这个错误:
Warning: file_put_contents(a_destruct.txt): Failed to open stream: Permission denied
$foo = new Foo();
unset($foo);
我尝试过的:
>将构造中的名称交换为destruct和back,但它始终只适用于__construct方法;
>在方法上添加输出以确认它们被调用 – 它们是(以及两个测试代码).
但是第二个主题告诉我,当我在脚本结束时销毁对象时,我’失去’权限(因为我确保调用了该方法).
造成这种情况的原因是什么以及如何解决?
解决方法:
要修复它,您可以使用完整路径:
public function __destruct(){
file_put_contents(dirname(__FILE__) . '/a_destruct.txt', 'd');
}
这在manual中有记录:
The working directory in the script shutdown phase can be different with some SAPIs (e.g. Apache).
这意味着您尝试在不同的目录中创建文件 – 以及您没有权限的目录.
这就是为什么它在你运行未设置($foo)时有效 – 因为它还没有处于关闭阶段.
虽然我不建议在关机阶段弄乱工作目录,但我觉得这表明它是可能的:
public function __destruct(){
$tmp = getcwd(); // get current working dir
chdir(dirname(__FILE__)); // set it to be same as the file
file_put_contents('a_destruct.txt', 'd');
chdir($tmp); // set the working dir back to what it was before
}