2015-09-04 4 views
0

Я только учусь ООП с PHP, и я пытаюсь получить мою голову вокруг этого:PHP - уничтожение осветление

Я использую PHP версии 5.6.10 на моей установке MAMP, если это делает разницу ??

Этот код у меня есть:

<?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.

Так что, когда я называю новый экземпляр класса Boss, он разрушается автоматически. Это мешает мне изменить «злобность» босса.

Как изменить код или, может быть, настройку php, которая не вызвана автоматически, но только с помощью функции 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! 

Так как вы можете видеть, constructor, changeEvilness() функция и destructor все дозвонились.

Также хорошо знать, что процесс php заканчивается, когда достигается последняя строка кода. Поэтому, поскольку после $ganon = new Boss у вас ничего нет, он остановит процесс php и вызовет деструктор.

+0

Я имел в виду функцию 'changeEvilness'. Извините, я изменил его! –

+0

'destructor' также будет вызываться, если больше нет ссылок на него до завершения процесса (я знаю, это деталь) – DarkBee

+0

Извините, что это была опечатка с моей стороны, я получил ее так, как вы ее получили. Я думаю, что меня смутило, что, когда я не вызываю функцию для изменения значения, она сразу же вызывает деструктор, что имеет смысл, но в примерах он все еще использует unset() - эту часть я не получаю. –

Смежные вопросы