【问题标题】:PHP - destruct clarificationPHP - 破坏说明
【发布时间】:2015-12-01 04:16:53
【问题描述】:

我只是在学习 PHP 的 OOP,我正在努力解决这个问题:

我在我的 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.

所以当我调用 Boss 类的新实例时,它会自动销毁。这让我无法改变boss的“邪恶”。

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

变化 我已更新拼写错误,但提供的答案仍然适用。

【问题讨论】:

  • 当没有对特定对象的引用时,会自动调用析构函数。无法更改(顺便说一句:$this-&gt;$evilness -> $this-&gt;evilness
  • 所以如果我想在定义实例后调用类中的函数,我只需要一个没有析构函数的类?
  • 提供的示例实际上很糟糕。 destructor 可用于将当前实例的属性保存到数据库/文件/...当不再有任何实例指向它时。如果你想在创建一个类后调用一个方法,你只需要:$foo = new Boss(); $foo-&gt;changeEvilness(42);。注意:一个类/函数应该从不负责输出输出

标签: php oop destructor unset


【解决方案1】:

我测试了下面的代码,它有效吗?您必须在 changeEvilness 函数中将 $this-&gt;$evilness 更改为 $this-&gt;evilness

<?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进程并调用析构函数。

【讨论】:

  • 我的意思是changeEvilness 函数。抱歉,我改了!
  • destructor 在进程结束前如果没有更多引用也会被调用(我知道,这是一个细节)
  • 对不起,这是我的错字,我是按照你的方式得到的。我想我很困惑,当我不调用函数来更改它立即调用析构函数的值时,这是有道理的,但在示例中他仍然使用 unset() - 那部分我没有得到。跨度>
  • 当您不再需要该实例时,您可以使用unset。它类似于$foo = null;。这样做是为了清除脚本中的一些资源(内存),提高其性能
猜你喜欢
  • 2021-05-18
  • 2014-06-28
  • 2014-04-04
  • 2018-10-20
  • 2017-12-14
  • 1970-01-01
  • 2011-04-02
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多