为了账号安全,请及时绑定邮箱和手机立即绑定

为什么析构函数被执行了2遍?

calss car(){

public function $txt = "1"

function __construct($name){  

echo "构造被调用";

$this->$name = $name

}

$a = new car(2);

$a->name;

这时候 应该是输出:

“构造被调用”

 1

之后再加上下面的析构函数

function __destruct(){   

echo "析构被调用".$txt

$b = new car(3);

$b->name;

这时候应该会输出

“构造被调用”

 3 

“析构被调用 2” 

“析构被调用 3”

怎么说呢,感觉老师讲的那个Nbaplaror是这个顺序,我也不知道该怎么说了,我不明白的地方是为什么最后为什么输出了两次 "析构被调用" 并且把实例化$a时传的值也调出来了? 

为什么在实例化$b的时候 $a时传的值还在

这和静态方法有关吗?其原理是什么

正在回答

5 回答

析构函数,在实例化的时侯会被自动调用,你实例化了两个对象,会调用两次析构函数,这理解是对的。

对于代码的是幕客网提供的编辑器,在你输入内容的左上角有代码语言可以选择,选择了对应的语言就会根据语言提供高亮显示效果。

http://img1.sycdn.imooc.com//573085ac0001708802860297.jpg

0 回复 有任何疑惑可以回复我~
#1

SAGEGSDAGESE 提问者

非常感谢你的耐心解答
2016-05-10 回复 有任何疑惑可以回复我~
#2

吴智彬 回复 SAGEGSDAGESE 提问者

~~呵呵
2016-05-11 回复 有任何疑惑可以回复我~
#3

yuyang123

反对!这里答主所说的应该是构造函数。 析构函数是在对象摧毁时就会运行(不是变量被摧毁,是对象)。 比如$jordan = new NbaPlayer();以后 你unset($jordan)或者$jordan = 1,都会调用其析构函数。
2016-06-08 回复 有任何疑惑可以回复我~

<code> 

class car{

    public $name;

    function __construct( $name )

</code>

0 回复 有任何疑惑可以回复我~

<pre>

class car{

    public $name;

    function __construct( $name )

</pre>

0 回复 有任何疑惑可以回复我~

你的代码完全无法执行,定义个类不是类的方法,

calss car(){
}

类的定义不应该是:

class car{
    
}

它不是个函数不应该有()小括号。

你定义的属性不是成员属性不是成员属性,成员方法不是成员方法,并且PHP基本的语法,结束的分号“ ; ”也多处没有写上 :

public function $txt = "1"

看你的写法应该是想定义属性的,那么就应该是这样写:

public $txt = "1";

你的构造函数$name这个属性在定义成为属性的时侯并没有定义过,这样的话在势例子化对象的时间,构造函数根本就不动$name是个什么对象,报 Notice: Undefined property: car::$name 这个属性没有定义!

function __construct($name){  
echo "构造被调用";
$this->$name = $name   //这里的分号你又没有写,并且$name这个属性并没有定义。
}
//在类的内部调用成员属性,要输出要在前面加个 echo  输出出来

下面是修改的代码:

class car{
    public $txt = "1";
    public $name;
    function __construct($name)
    { 
        echo "构造被调用";
        echo $this->$name = $name;
    } 
}

看你的代码,我想你的意图应该是想默认初始化对象是$name
="1",然后实例化对象的时侯根据你传的值修改默认值成为2,然后再实例化1个对象$name
值为3吧。

class car{
    public $name;
    function __construct( $name )
    {
        echo "构造被调用<br />";
        echo $this->name = $name . "<br />";
    }
}
$a = new car(2);
echo $a->name;
$b = new car(3);
echo $b->name;

拼接了个<br />是在为了在浏览器显示换行,方便看清楚效果。
建议你想将php的基本的语法先掌握再深入学习,效果应该会好些。

0 回复 有任何疑惑可以回复我~
#1

SAGEGSDAGESE 提问者

还是被你看出来了..我就是想这样写的,当时脑袋太乱写错了太多细节,不过你说的我能理解。我是想再加上析构函数 function __destruct(){echo "析构被调用".$name;} 如果我理解没错的话,应该会调用两次析构函数,包括构造被调用2和构造被调用3 不明白为什么执行两次析构函数,是因为有两个对象的原因? 综合来说可能还是不太了解析构函数会在什么时候调用。 因为老师那个代码太长懒得搬来,结果好像被自己弄得更复杂了... 另外你的那个代码是怎么写的啊,很整洁并且有背景色和行数,怎么写
2016-05-09 回复 有任何疑惑可以回复我~
#2

SAGEGSDAGESE 提问者 回复 SAGEGSDAGESE 提问者

“包括析构函数被调用2和析构函数被调用3” 上面把析构写成构造了
2016-05-09 回复 有任何疑惑可以回复我~

你这代码乱的我完全看不明白,但是你的问题我可以大概的回答你

  1. 为什么输出了两次 "析构被调用"    是因为析构函数在变量摧毁时就会运行,每次代码运行结束就会调用,所以你这里是两次

  2. 静态方法有关吗?其原理是什么   静态方法关键词是static,在你的代码里我并没有看到静态方法的运用

0 回复 有任何疑惑可以回复我~
#1

SAGEGSDAGESE 提问者

析构函数在每次代码运行结束会调用,怎么样才算结束呢?一个对象的程序结束后?还是说等php所有代码全部执行后才调用
2016-05-09 回复 有任何疑惑可以回复我~
#2

yuyang123 回复 SAGEGSDAGESE 提问者

俩种情况,1、手动清除,比如你unset($jordan),删除这个变量,或者改变$jordan的指针,重新复制,比如给它一个null或者其他的值,$jodan = 1;这样也可以,其析构函数就会被调用。 2、PHP引擎自动清除,比如执行完这些代码,系统对其进行内存垃圾回收,就会把这些变量清除掉,所以也会调用析构函数。
2016-06-08 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

为什么析构函数被执行了2遍?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信