Nasıl bir PHP sınıfı yürütülmesini durdurabilirim?

3 Cevap php

Döngüler için break gibi bir şey arıyorum.

İşte stop() sınıf devam izin vermedi ve I_DONT_WANT_THIS_TO_RUN() idam olmaz (Symfony'nin kireç kullanarak) bazı örnek kod.

$browser->isStatusCode(200)
  ->isRequestParameter('module', 'home')
  ->isRequestParameter('action', 'index')
  ->click('Register')
  ->stop()
  ->I_DONT_WANT_THIS_TO_RUN();
$browser->thenThisRunsOkay();

$this->__deconstruct(); içinde stop() hile yapmak için görünmüyor çağırıyor. Bunun gerçekleşmesi olacağını stop() içinde arayabileceğiniz bir işlevi var mı?

3 Cevap

Sadece denilen her yöntem için $ this dönecektir başka bir sınıf dönmek.

Örnek:

class NoMethods {
    public function __call($name, $args)
    {
        echo __METHOD__ . " called $name with " . count($args) . " arguments.\n";
        return $this;
    }
}

class Browser {
    public function runThis()
    {
        echo __METHOD__ . "\n";
        return $this;
    }

    public function stop()
    {
        echo __METHOD__ . "\n";
        return new NoMethods();
    }

    public function dontRunThis()
    {
        echo __METHOD__ . "\n";
        return $this;
    }
}

$browser = new Browser();
echo "with stop\n";
$browser->runThis()->stop()->dontRunThis()->dunno('hey');
echo "without stop\n";
$browser->runThis()->dontRunThis();
echo "the end\n";

: Neden olacaktır

with stop
Browser::runThis
Browser::stop
NoMethods::__call called dontRunThis with 0 arguments.
NoMethods::__call called dunno with 1 arguments.
without stop
Browser::runThis
Browser::dontRunThis
the end

Sen kullanabilirsiniz PHP exceptions:

// This function would of course be declared in the class
function stop() {
    throw new Exception('Stopped.');
}

try {
    $browser->isStatusCode(200)
      ->isRequestParameter('module', 'home')
      ->isRequestParameter('action', 'index')
      ->click('Register')
      ->stop()
      ->I_DONT_WANT_THIS_TO_RUN();
} catch (Exception $e) {
    // when stop() throws the exception, control will go on from here.
}

$browser->thenThisRunsOkay();

Ben nesne aniden başka bir şey değiştirir eğer kafa karıştırıcı olabilir görebiliyordu ama OIS's answer, gerçekten çok iyi. Yani, sizin zincirinin sonunda, aynı nesne ile bitireceğiz beklersiniz. Bu sorunu önlemek için, ben olsun veya olmasın aslında bir şey yapmak için sınıfını anlatmak için özel bir değişken eklemek istiyorum. Sınıf durdurulmuş ise, o zaman her sınıf sadece hemen $this döndürür. Bu size yürütülmesine yeniden başlatmanız mümkün olmanın yararı verir.

class MyClass {
    private $halt;

    function __call($func, $args) {
        if ($this->halt) {
            return $this;
        } else {
            return $this->$func($args);
        }
    }

    private function isRequestParameter() {
        // ...
    }
    public function stop() {
        $this->halt = true;
    }
    public function start() {
        $this->halt = false;
    }
}

Eğer bu kodu çoğaltmak zorunda kalmamak için bu bir üst sınıfa koymak olabilir.