2015-09-04 56 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() - 我不明白這一部分。 –