当我创建我的类的对象实例时会发生啥
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()
操作毫无用处,因为它们将由标准析构函数处理。以上是关于当我创建我的类的对象实例时会发生啥的主要内容,如果未能解决你的问题,请参考以下文章