首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__destruct in __construct?

__destruct in __construct?
EN

Stack Overflow用户
提问于 2011-12-21 16:46:53
回答 4查看 4.1K关注 0票数 2

我遇到了一种情况,如果条件在__destruct中为真,则需要调用__construct

如何在构造函数中调用析构函数?

有办法吗?

我可以用一个技巧来完成这个任务,但是我需要在我的类中完成它,如果不符合我的标准,目标是销毁一个类。

编辑:

在构造函数中,我检查用户权限,如果试图删除post的用户不是admin,那么类的对象不应该实例化,换句话说,应该进行析构。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-21 17:44:10

避免在构造函数中执行实际工作。构造函数应该从本质上构建对象的实例。从构造函数调用__destruct()是没有意义的,因为实例不是属于类的方法,而是由调用new操作符的函数所拥有。

问问自己,在不能构造对象的情况下,调用站点上的new操作符应该返回什么?

代码语言:javascript
复制
$obj = new Class();

如果对象不能正确地构造,应该为$obj分配什么?NULL?或者这段代码根本就没有意义?

你有几个选择:

  1. 从构造函数中删除任何非构造代码,这样构造函数就不会失败。将任何失败的代码放在另一个方法中。示例:

$obj =新类();如果( $obj->initSomeStateThatMayFail() ){ // good,继续.}{ //处理失败.} unset($obj);// calls __destruct()

  • If构造函数中的一个失败应通知调用方,使用静态工厂方法测试类实例化是否有效,并适当地返回null或新实例。

类{静态函数makeClass() { if ( testIfValidToInstantiate() ){返回新的self();} $obj {返回null;}} // .} $obj = Class :makeClass();if ($obj !== null ){ //进行.}

  • 如果如果不能构造类,那么代码根本就没有意义,那么也许您应该抛出一个异常。

类{函数__construct() { if ( !testIfValidToInstantiate() )抛出新异常(“意外条件”);// .}尝试{ $obj =新类();// .}捕捉(异常$e ){ //做一些事情来处理这种情况.}

票数 10
EN

Stack Overflow用户

发布于 2011-12-21 16:52:02

请理解,调用析构函数与从工作集中删除类不是一回事!

如果myClass是在构造函数中解构的类,那么

代码语言:javascript
复制
$a=new myClass();

仍然会导致将$a分配给myClass的实例!

票数 3
EN

Stack Overflow用户

发布于 2011-12-21 16:49:38

您不能从构造函数中销毁对象,但是可以让它设置一个变量,在创建它之后,它才是真正的销毁对象。就像这样:

代码语言:javascript
复制
<?php
class test{
  function __construct(&$dest=false){
    echo "Constructed\n";
    if(1 == 1){ //Some condition
      $dest = true;
    }
  }

  function __destruct(){
    echo "De-Constructed\n";
  }
}

$a = new test($d);
if($d){
  unset($a);
}
echo "End Prog\n";

演示:http://ideone.com/fJxOq

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8593308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档