【问题标题】:Should i use unset inside a function?我应该在函数中使用 unset 吗?
【发布时间】:2017-06-03 03:08:42
【问题描述】:

解除$data有什么目的吗?如果它包含大数据,我应该取消它吗?

<?php
require 'db.php';
class Test{
    public $id = 0;
    public $name;
    public function __construct()
    {
        $this->getUserInfo();
        echo $this->name;
    }
    private function getUserInfo()
    {
        global $db;
        $query = $db->prepare('SELECT id,name FROM users WHERE group = :g LIMIT 1');
        if ($query->execute(array('g' => 'admin')))
        {
            $data = $query->fetch(); // <--
            $this->id = $data[0];
            $this->name = $data[1];
            return true;
        }
    }
}
(new Test);
?>

【问题讨论】:

  • 现在没有你使用的 php 版本。但有时在某些 php 版本中,局部变量并没有被抓取收集器正确清除,所以如果你想确保这样做$data=null;unset($data);。
  • 这里有很多关于该主题的阅读:stackoverflow.com/questions/2461762/force-freeing-memory-in-php 也阅读评论以获得概述。
  • @JustOnUnderMillions 谢谢,我使用的是 PHP 7.0.9。我认为它会正确清洁它。
  • FasterThanLight PHP 哦,好的。那么,别担心。但可以阅读php中的references和references of references。

标签: php unset


【解决方案1】:

没必要。当函数返回时,变量自行消失。

即使您取消设置它,您仍然可以引用它包含在$this-&gt;id 和$this-&gt;name 中的值,因此它们的内存不会被回收。您将回收的唯一内存是指向它们的微小数组对象。

当你做作业时,PHP 不会复制。字符串和数字是不可变的,因此无需复制它们。对象是通过引用复制的。并且数组使用写时复制技术,因此只有在旧引用仍然存在时才复制它们,然后您修改副本。

【讨论】:

  • 要弄清楚$this-&gt;id = trim($data[0]);此时会阻止引用吗?
  • 是的,因为这会创建一个新字符串。
  • 所以我们可以说everthing 是 php 中的引用,只要您不更改新变量的内容/值。做类似$data=null; 这样的事情来防止在复杂代码中引用引用不是有点节省吗!?
  • 除非你的脚本运行了很长时间,否则它可能根本不重要。脚本完成后一切都消失了。我从来没有费心清除脚本中只是响应网络请求的变量。
  • 如果您使用循环处理每个项目,则每次读取一行时,您将替换保存前一行数据的变量。除非代码做一些奇怪的事情,否则任何大数据都不太可能持续很长时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2012-11-01
  • 1970-01-01
  • 2021-05-24
  • 2011-07-15
  • 2019-02-28
  • 1970-01-01
相关资源
最近更新 更多