当我创建我的类的对象实例时会发生啥

Posted

技术标签:

【中文标题】当我创建我的类的对象实例时会发生啥【英文标题】: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 【参考方案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() 操作毫无用处,因为它们将由标准析构函数处理。

以上是关于当我创建我的类的对象实例时会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

当我增加 ec2 实例的运行量大小时会发生啥

如果有的话,在 java 中声明给定类的空对象字段时会发生哪些特定于类的操作?

当我清除一个结构向量时会发生啥?

当在声明它的父类的实例上调用纯虚函数时会发生啥?

当我重新启动 EC2 实例时会发生啥?

python:当类属性、实例属性和方法都同名时会发生啥?