PHP: creazione di un metodo pseudo-join all'interno di un oggetto
-
22-07-2019 - |
Domanda
Sto cercando di creare un oggetto in grado di gestire istruzioni condizionali simili a query. In questo modo posso "unire" due condizioni insieme per creare una dipendenza tra loro in base al tipo di "join" utilizzato. Al momento ho un oggetto semplice che contiene i seguenti metodi:
public function addCondition ( Condition $condition, $join = null )
{
$this->conditions[] = $condition;
}
public function validate ( )
{
foreach ( $this->conditions as $condition )
{
$result = $condition->validate( );
[...]
}
}
Il problema è che devo essere in grado di eseguire un join condizionale tra due istruzioni, che influirà sul valore di ritorno del metodo validate. L'idea è che potresti fornire una condizione come segue:
$this->addCondition($condition_1);
$this->addCondition($condition_2, 'AND');
$this->addCondition($condition_3, 'NOT');
Ciò genererebbe quindi la logica richiesta per specificare che i risultati della terza condizione verrebbero a catena all'indietro per influenzare i risultati della prima condizione.
Nell'esempio, diciamo:
condition_1 = Apple is Red condition_2 = Apple is Ripe condition_3 = Apple is Golden Delicious
Usando questo dovrei supporre che se dovessi passare una mela deliziosa matura, rossa e dorata, il risultato di validate () sarebbe falso. Il metodo dovrebbe fallire perché il 'join' per condition_3 NON è.
Tuttavia, al momento non è possibile dire al codice che il risultato dell'intero metodo dipende dal risultato della condizione precedente e dal modo in cui è unito ad esso.
Qualsiasi aiuto è molto apprezzato! Grazie.
Soluzione
Inserisci la logica nelle sottoclassi delle tue condizioni.
Crea una classe Condition_And che accetta due (o più) oggetti Condition e restituisce true solo se sono entrambi true.
Crea una classe Condition_Or che accetta due (o più) oggetti Condition e restituisce false se ne esiste una vera.
Crea una classe Condition_Not se ritieni che sia necessaria (Apple NON è Golden Delicious).
La creazione di stringhe insieme dovrebbe farti ottenere qualsiasi query tu stia cercando. Poiché sono tutte sottoclassi dello stesso tipo, è possibile crearle inserendo NOT all'interno di OR all'interno di AND all'interno di OR e così via.
Altri suggerimenti
I condizionali che coinvolgono sia AND
che OR
sono intrinsecamente nidificati. La tua classe non sembra avere modo di esprimerlo.
Nessun annidamento significa che le tue condizioni devono essere unite a AND
, oppure a tutte le OR
. In ogni caso, non è possibile utilizzare entrambi contemporaneamente.
Nel tuo esempio, AND
sembra la scelta naturale, quindi tutto ciò di cui hai bisogno è un flag NOT
per ogni condizione:
$this->addCondition($condition_1, true); // e.g.: must be true to succeed
$this->addCondition($condition_2, true);
$this->addCondition($condition_3, false); // e.g.: must be false to succeed
Dovresti quindi fare:
$valid = true;
foreach ( $this->conditions as $condition )
{
$valid = $valid && $condition->validate();
if (!$valid)
{
// react to "validation failed at $condition"
}
}
return $valid;