5 Stimmen

Wie kann man die Ausführung einer PHP-Klasse verhindern?

Ich bin auf der Suche nach etwas wie break für Schleifen.

Hier ist ein Beispielcode (unter Verwendung von Symfony's lime), bei dem stop() den Unterricht nicht fortsetzen lassen wollte und I_DONT_WANT_THIS_TO_RUN() nicht ausgeführt werden.

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

Aufruf von $this->__deconstruct(); von innen stop() scheint das nicht zu funktionieren. Gibt es eine Funktion, die ich innerhalb von stop() die das möglich machen würde?

10voto

Paige Ruten Punkte 164391

Sie könnten verwenden PHP-Ausnahmen :

// 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();

6voto

OIS Punkte 9481

Geben Sie einfach eine andere Klasse zurück, die für jede aufgerufene Methode $this zurückgibt.

Beispiel:

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";

Wird dazu führen:

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

1voto

nickf Punkte 517253

Die Antwort von OIS ist wirklich gut, obwohl ich verstehen könnte, dass es verwirrend werden könnte, wenn das Objekt plötzlich zu etwas anderem wird. Das heißt, man würde erwarten, dass man am Ende der Kette dasselbe Objekt hat. Um dieses Problem zu vermeiden, würde ich eine private Variable hinzufügen, die der Klasse mitteilt, ob sie tatsächlich etwas tun soll oder nicht. Wenn die Klasse gestoppt wurde, dann gibt jede Klasse einfach $this sofort. Das hat den zusätzlichen Vorteil, dass Sie die Ausführung neu starten können.

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;
    }
}

Dies könnte in eine übergeordnete Klasse eingefügt werden, damit Sie diesen Code nicht duplizieren müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X