2015-09-04 55 views
0

我刚刚学习OOP与PHP,我试图让我的头在此:PHP-destruct澄清

我在我的MAMP安装使用PHP版本5.6.10,如果这有所不同?

此代码,我有:

<?php 

    class Baddie { 
     public $evilness = 10; 
    } 

    class Boss extends Baddie { 
     public $evilness = 50; 

     public function changeEvilness($value) 
     { 
      //$this->$evilness = $value; Had this, which was a typo 
      $this->evilness = $value; 
     } 

     public function __destruct() { 

      echo "You beat the boss!"; 
     } 

    } 

    $ganon = new Boss; 

?> 

//Note the code is from Rob Percivals Udemy course, hence the gaming references.

所以,当我叫老板类的新实例,它就会自动销毁。这阻止了我改变老板的“邪恶”。

我该如何更改代码,或者可能是一个php设置,destruct()不会自动调用,而只能使用unset()函数,以便我可以调用该类的其他方法?

更改 我已更新错字错误,但提供的答案仍然适用。

+0

当没有对特定对象的引用时,将自动调用析构函数。不能改变它(btw:'$ this - > $ evilness' - >'$ this-> evilness') – Rizier123

+0

因此,如果我想在定义实例后调用类中的函数,我只需要一个没有析构函数的类? –

+0

提供的示例非常糟糕。当不再有实例时,可以使用'析构函数'将当前实例的属性保存到数据库/文件/ ...中。如果你想在创建一个类之后调用一个方法,你只需要:'$ foo = new Boss(); $ foo-> changeEvilness(42);'。注意:一个类/函数应该**从不可**输出输出 – DarkBee

回答

1

我测试了下面的代码,它的工作原理?你必须改变$this->$evilness$this->evilness在changeEvilness功能

<?php 

    class Baddie { 
     public $evilness = 10; 
    } 

    class Boss extends Baddie { 
     public $evilness = 50; 

     public function changeEvilness($value) 
     { 
      $this->evilness = $value; 
     } 

     public function __destruct() { 

      echo "You beat the boss!"; 
     } 

    } 

    $ganon = new Boss; 
    echo $ganon->evilness ."\n"; 
    $ganon->changeEvilness(1337); 
    echo $ganon->evilness ."\n"; 
?> 

此输出:

50 
1337 
You beat the boss! 

因此,大家可以看到,constructorchangeEvilness()功能和destructor所有被调用。

另外很高兴知道php进程在达到最后一行代码时结束。因此,因为$ganon = new Boss之后你什么也没有,它会停止php进程并调用析构函数。

+0

我的意思是'changeEvilness'函数。对不起,我改变了! –

+0

如果在过程结束之前没有更多的引用,那么'析构函数'也会被调用(我知道,这是一个细节) – DarkBee

+0

对不起,这是我的一个错字,我按照你的方式得到它。我觉得我很困惑,当我不调用函数来改变它的值时,它立即调用析构函数,这很有道理,但在示例中,他仍然使用unset() - 我不明白这一部分。 –