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

来源:3-5 析构函数-PHP面向对象编程

SAGEGSDAGESE

2016-05-08 18:26

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回答

  • 吴智彬
    2016-05-09 20:42:29
    已采纳

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

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

    http://img.mukewang.com/573085ac0001708802860297.jpg

    yuyang...

    反对!这里答主所说的应该是构造函数。 析构函数是在对象摧毁时就会运行(不是变量被摧毁,是对象)。 比如$jordan = new NbaPlayer();以后 你unset($jordan)或者$jordan = 1,都会调用其析构函数。

    2016-06-08 15:54:46

    共 3 条回复 >

  • SAGEGSDAGESE
    2016-05-09 09:04:06

    <code> 

    class car{

        public $name;

        function __construct( $name )

    </code>

  • SAGEGSDAGESE
    2016-05-09 09:02:14

    <pre>

    class car{

        public $name;

        function __construct( $name )

    </pre>

  • 吴智彬
    2016-05-09 01:56:23

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

    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的基本的语法先掌握再深入学习,效果应该会好些。

    SAGEGS... 回复SAGEGS...

    “包括析构函数被调用2和析构函数被调用3” 上面把析构写成构造了

    2016-05-09 09:53:35

    共 2 条回复 >

  • 两点前我不会睡觉
    2016-05-09 00:55:55

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

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

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

    yuyang... 回复SAGEGS...

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

    2016-06-08 15:52:16

    共 2 条回复 >

PHP面向对象编程

从容应对面试官的知识宝典,带你握面向对象的最重要的核心能力

70146 学习 · 361 问题

查看课程

相似问题