微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 脚本在魔法方法中失去权限__destruct()

我试图在对象实例化上创建一个文件,并在对象销毁时创建另一个文件.

这是代码

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
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐