1

ここにコードがあります:

abstract class A
{
    abstract public function add();

    public function callItself()
    {
        echo __CLASS__.':'.__FUNCTION__.' ('.__LINE__.')<br>';
        if (rand(1,100) == 5) { die; }
        $this->callItself();
    }
}

class B extends A
{
    public function add()
    {
        echo __CLASS__.':'.__FUNCTION__.' ('.__LINE__.')<br>';
    }
}

class C extends B
{
    public function add()
    {
        echo __CLASS__.':'.__FUNCTION__.' ('.__LINE__.')<br>';
        parent::add();
        parent::callItself();
    }

    public function callItself()
    {
        echo __CLASS__.':'.__FUNCTION__.' ('.__LINE__.')<br>';
        throw new Expection('You must not call this method');
    }
}

$a = new C();
$a->add();
die;

クラスでは を呼び出しCてはcallItself()ならないため、例外をドロップします。私たちが知っているように、私はそれをプライベートに設定することはできません:)しかし、10行で、代わりに$this->callItself();そのメソッドを呼び出すので、それは死にます。しかし、私はそれをしたくありません、どうすればそれを回避できますか?**C**A

4

1 に答える 1

2

self::callItself()の代わりに使用$this->callItself();

交換

public function callItself()
{
    echo __CLASS__.':'.__FUNCTION__.' ('.__LINE__.')<br>';
    if (rand(1,100) == 5) { die; }
    $this->callItself();
}

public function callItself() {
    echo __CLASS__ . ':' . __FUNCTION__ . ' (' . __LINE__ . ')<br>';
    if (rand(0, 2) == 0) { <------- Better Probability 
        die();
    }
    self::callItself(); <---- This would continue to call A:callItself until die
}

出力

C:add (23)
B:add (17)
A:callItself (7)
A:callItself (7)
A:callItself (7)
A:callItself (7)
A:callItself (7)
A:callItself (7)
于 2012-10-28T22:45:47.797 に答える