【问题标题】:what happens when I create a object instance of my class当我创建我的类的对象实例时会发生什么
【发布时间】:2015-09-16 15:09:33
【问题描述】:

我有两个这样的课程:

class one
{
    public $var1 = 'anythig';
}

class two
{
    public $var2 = 'anythig';
}

我想知道当我创建这些类的对象实例时会发生什么?我的观点是关于存储在内存中的值。实际上我有一些大班,我的资源是有限的。那么我想知道,如果我在不需要的时候把NULL 放到我的课堂上会好吗?并帮助优化?

我有一个 switch() 来包含所需的课程。像这样:

switch{
          case "one":
          require_once('classes/one.php');
          break;

          case "two":
          require_once('classes/two.php');
          break;
      }

每次我只需要一节课。当我定义一个新对象 ($obj = new class) 之前定义为对象实例的类会发生什么情况?那是留在记忆中吗?如果我输入NULL 有帮助吗?请指导我..

编辑:

最后一行有用还是没用?

$obj = new myvlass;
echo $obj->property; // there is where that my class is done
$obj=NULL;

【问题讨论】:

  • null 或新实例分配给现有对象变量都会破坏先前的对象,假设没有其他对象引用它。
  • @Ja͢ck 什么?当我像这样$class1 = new class1; 创建一个class1 的实例,然后像这样$class2 = new class2 创建一个class2 的新对象时,现在$class1 将被销毁?
  • @Ja͢ck 是吗?我该怎么办 ?!我把NULL放进去?如何释放内存?
  • unset($class1, $class2); 销毁这两个对象。
  • @Ja͢ck aha,请查看我的编辑,然后告诉我是与否,tnx

标签: php class oop object php-internals


【解决方案1】:

What determines when a class object is destroyed in PHP?

PHP 手册指出“只要删除对特定对象的所有引用,就会调用析构函数”,这是真的(尽管可能会导致一些 undesirable behaviour。)

如果您将对象变量显式设置为NULL 并不重要,PHP 无论如何都会破坏它。

【讨论】:

  • 你看,我的课很重,我的在线用户也很多,我的资源是有限的,你还是告诉*你显式设置一个对象变量为@也没关系987654324@ ?你对unset($obj); 有什么看法?谢谢
  • 未设置($obj);与将其设置为 null 执行相同的操作。这并不重要,因为无论您是否将其设置为 null,PHP 都会做同样的事情(破坏类)。
  • 啊哈,那么 php 会做吗?!很好,我应该做点什么吗?我的意思是我需要在__destruct() 中写入任何内容吗?
  • 关闭文件句柄、数据库连接等。
  • 代码是否在循环中运行,其中 switch 调用将被多次调用?一旦脚本结束,无论如何它都会被销毁。
【解决方案2】:

我会推荐我最好的实现类的方法如下:

<?php
class scSendMail
{
    protected $from;
    protected $toList;
    protected $replyTo;
    protected $subject;
    protected $message;
    public function __construct()
    {   
        register_shutdown_function(array($this,'__destruct'));
        $this->setFrom("updates@planetonnet.com");
        $this->setReplyTo("noreply@planetonnet.com");
        $this->setSubject("Update from PlanetOnNet.com");
    }

    public function __destruct()
    {
        unset($this->from);
        unset($this->toList);
        unset($this->replyTo);
        unset($this->subject);
        unset($this->message);
    }


    public function sendMail()
    {
     // ..... body
    }


}

?>

这样,当不需要对象时,它会自行销毁并通过取消设置使用的变量来释放内存。

您可以随时启动另一个对象以替换为新对象,但请注意根据当前持有的对象使用方法。

您可以设置为 NULL 以在您不再需要使用它时释放内存并使用新变量来使用新对象。

【讨论】:

  • 执行所有这些unset() 操作毫无用处,因为它们将由标准析构函数处理。
猜你喜欢
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2016-07-19
  • 2014-03-02
相关资源
最近更新 更多