PHP Viele if Bedingungen zusammenfassen?

selberbauer

Captain
Registriert
Juni 2009
Beiträge
3.604
Hallo,
ich habe eine if Bedingung, welche drei Bedingungen mit OR Verknüpft.

Das ergibt eine ziemlich lange Zeile, gibt es eine Möglichkeit, wie man das sinnvoll zusammenfassen kann?
 
Von der Logik her oder von der Optik?

Ohne die Bedingung zu sehen, kann man zu Fall 1 nicht viel sagen.
Zeilenumbrüche kannste reinmachen wie du lustig bist und so eine Formatierung einführen.
 
Switch - Case Anweisung, denke das sollte dir helfen.
 
Ich glaube nicht so recht an Switch Case in seinem Fall, OR Verknüpfung impliziert ja, dass immer das selbe passieren soll in allen 3 Fällen.
 
Das hängt vom logischen Zusammenhang ab. Ganz grundsätzlich besteht natürlich immer die Möglichkeit eine Methode anzulegen, die boolean als return type hat und die nichts anderes macht als genau deine Bedingungen zu prüfen (mit Umbrüchen nach jeder Bedingung, für bessere Lesbarkeit).

Damit musst du dann im restlichen Code nur noch diese Methode aufrufen deren Name ja kurz gehalten sein kann.
 
Also ich habe das so:
PHP:
<?php

if( ($var[1] == FALSE) OR ($var[2] == FALSE) OR ($var[3] == FALSE) ) {
}

?>

Nur eben noch etwas länger und komlizierter...

PHP ist es egal, aber leserlich macht es schon was aus.

Mir wäre nur noch eingefallen, sowas:
PHP:
<?php

$clause     = array();
$clause[1] = ($var[1] == FALSE);
...

if( !$clause[1] OR !$clause[2] OR !$clause[3] ) {
}

?>

Aber ich bin mir nicht sicher, ob das es nicht verschlimmbessert.
 
Du könntest jede einzelne Klausel in eine eigene Zeile schreiben, etwa so:

PHP:
if ($var[1] === false
        || $var[2] === false
        || $var[3] === false) {
    ...
}
 
Wenn du nur auf einen Wert prüfst, schreib dir doch eine Funktion die das erledigt.
PHP:
function IsAll( $Data, $ComparingValue )
{
  if( is_array( $Data ) )
  {
    foreach( $Data as $v )
      if( $v !== $ComparingValue )
        return false;
    return true;
  }
  else
    return $Data === $ComparingValue;
}

if( IsAll( $clause, false ) )
  // ...
Btw ist dein letzter Code falsch, denn doppeltes Invertieren hast du wohl nicht beabsichtigt. Wenn $var[1] bereits false ist und deine Bedingung erfüllt, prüfst du doch mit !$clause[1] doch erneut, ob dieser Wert nicht stimmt. Ergo prüfst du auf $var[1] == true.

Ggf. gibst du dem Ganzen noch eine anonyme Funktion mit und kannst variabel überprüfen.
 
Ich habe wohl zu stark vereinfacht.
Also der Original Code entstammt einer Session-Management Klasse von mir:

PHP:
	public function ini() {
		session_start();
		if( (!$_SESSION['state']) OR ($_SESSION['two'] != hash('SHA512', $string[1].$_SERVER['HTTP_USER_AGENT'].$string[2])) OR ($_SESSION['one'] != hash('SHA512', $string[3].$key[1].$string[4])) ) {
			header('Location: validation.php');
			exit();
		}
	}
 
Warum berechnest du nicht einfach die ganzen Hashwerte vorher und speicherst sie in Variablen. Das macht die Sache gleich viel übersichtlicher..
 
Soll ich alle Werte im Konstruktor erstellen oder kann ich die in die Klasse durch z.B.:
public hash = array();
public hash[] = hash('SHA512', $string[1].date().$string[2]);
setzen?
 
Zurück
Oben