Ternary operator w PHP

Jakiś czas temu bawiłem się skróconą wersją konstrukcji IF, czyli tzw. ternary operator. O samym operatorze można poczytać w manualu PHP. A tutaj zamieszczam krótki przykład do walidacji pól checkbox formularza - wymusza ścisłą kontrolę nad wartością przesłanych danych i zawsze zwraca wartość - pozytywną (ustawiony na "tak" albo "true"), negatywną ("nie" albo "false"), oraz dla (jeszcze) nieustawionych wartość domyślną.

Zakładając, że wartość "włączonego" checkboxa - "prawda" lub "true" będzie oznaczana jako 1, a wartość "wyłączonego" - "fałsz", "false" jako 0, a wartością domyślną będzie "1" lub "0".

Normalnie przy użyciu IF-a moglibyśmy napisać:

<?php
    // jeżeli pole jest ustawione (znajduje sie w bazie/tablicy), to może przyjąć tylko dwie wartości - 0 lub 1
    if(isset($field))
    {
        // jeżeli pole równe jest jeden, to wartość będzie równa 1, w przeciwnym wypadku 0
        if($field == 1)
            $value = $field;
        else
            $value = 0;
    }
    else // pole nie istnieje w ogóle, wiec możemy nadać mu wartość domyślną
    {
        $value = $default;
    }


Natomiast skrócona wersja z wykorzystaniem ternary operatora będzie wyglądać następująco:

$value = (isset($field)) ? ($field == 1) ? $field : 0 : $default;

Uruchomiłem kilka testów:

<?php

// oczekuje $default
// $field = 1; //oczekuję 1
// $field;  // oczekuje $default
// $field = 0; //oczekuje 0

$default = 1;

$value = (isset($field)) ? ($field == 1) ? $field : 0 : $default;

echo $value;


Każdy komentarz to kolejny test:
  1. Jeżeli nie ustawimy pola $field w ogóle - zwrócona zostaje wartość $default.
  2. $field ustawione na 1 - formuła zwraca 1
  3. Pole $field istnieje ale jest puste - zwrócona zostaje wartość $default
  4. W tym teście cokolwiek podstawimy pod wartość $field zostanie zwrócone jako wartość $value. Dlatego warto rozważyć zamienienie w formule ostatniego $field na naszą wartość - ustawiony. W ten sposób będziemy pewni że w naszej bazie zawsze wyląduje albo wartość 1 albo 0:

$value = (isset($field)) ? ($field == 1) ? 1 : 0 : $default;

Brak komentarzy:

Prześlij komentarz