Frage

Ich finde in meinem PHP-Seiten, die ich mit Linien und Codezeilen am Ende, die wie folgt aussehen:

$my_id = isset($_REQUEST['my_id']) ? $_REQUEST['my_id'] : '';
$another_var = isset($_REQUEST['another_var']) ? $_REQUEST['another_var'] : 42;
...

Gibt es einen besseren, prägnant, oder besser lesbar Weg, um dieses Array zu überprüfen und sie zu einem lokalen Variablen zuweisen, wenn sie vorhanden ist oder ein Standard-Anwendung, wenn sie es nicht tun?

EDIT: Ich mag nicht register_globals() verwenden - ich immer noch das isset Problem sowieso haben würde

.
War es hilfreich?

Lösung

Wie wäre es in einer Funktion Einwickeln?

<?php

function getPost($name, $default = null) {
    return isset($_POST[$name]) ? $_POST[$name] : $default;
}

Andere Tipps

eine bessere Methode könnte eine Singleton / statische Klasse zu abstrahieren die Details der Überprüfung der Anforderungsdaten zu erstellen sein.

So etwas wie:

class Request {

  private $defaults = array();
  private static $_instance = false;

  function getInstance () {
    if (!self::$_instance) {
     $c = __CLASS__;
      self::$_instance = new $c;
    }
    return self::$_instance;
  }

  function setDefaults($defaults) {
    $this->defaults = $defaults;
  }

  public function __get($field) {
    if (isset($_REQUEST[$field]) && !empty($_REQUEST[$field])) {
        return $_REQUEST['field'];        
      } elseif (isset($this->defaults[$field])) {
        return $this->defaults[$field];
      } else {
        return ''; # define a default value here.
      }
   }
}

Sie können dann tun:

# get an instance of the request
$request = Request::getInstance();

# pass in defaults.
$request->setDefaults(array('name'=>'Please Specify'));

# access properties
echo $request->name;
echo $request->email;

Ich denke, das Ihre individuellen Skripte Lasten macht saubere und Abstracts mit diesem Entwurf der Validierung etc. plus Lasten des Umfangs weg zu verlängern it / fügen Sie alternative Verhaltensweisen, fügt kompliziertere Standardbehandlung etc etc.

Verwenden Sie zuerst $_POST für entsandte Variablen. $_REQUEST ist ein Mashup von vielen verschiedenen eingehenden Variablen, nicht nur $_POST und könnte zu Problemen führen.

Eine Lösung für Ihre Frage wäre, eine Funktion zu erstellen, die die isset() Logik behandelt.

function ForceIncomingValue($Key, $Default) {
    if (!isset($_POST[$Key]))
         return $Default;
    else return $_POST[$Key];
}

zunächst, NIEMALS die $ _REQUEST Variable, wird es zu Bugs und andere Probleme während der Entwicklung führen


function getPOST($key) {
    if(isset($_POST[$key])) {
        return $_POST[$key];
    }
}

note that this code leaves the variable empty when $_POST[$key] nicht gesetzt wurde

Sie können auch diesen Code anpassen, damit Sie stattdessen Ihnen eine (sinnvolle) Standard liefern, wenn der Wert nicht geladen werden konnte.

function getPOST($key, $default = NULL) {
    if(isset($_POST[$key])) {
        return $_POST[$key];
    } else {
        return $default;
    }
}

Ist die Menge der Variablen Sie zum Zeitpunkt des Schreibens des Skripts bekannt, Leicht oder tun Sie dies für einen beliebigen Satz von Werten zu tun? Ist ersteres der Fall ist, Sie so etwas tun könnte:

# This array would hold the names of all the variables you're expecting
# and a default value for that variable name
$variableNames = array (...); 
foreach ($variableNames as $key => $default) {
    if (isset ($_REQUEST[$key])) $$key = $_REQUEST[$key];
    else $$key = $default;
}

Im Grunde ist dieser Vorteil von PHP die Fähigkeit nimmt Variablen zu bewerten andere Variablen zu erstellen. (Daher der Doppel Dollar für $$ Schlüssel - das bedeutet eine neue Variable erstellen, dessen Name ist der Wert von $ key)

Ich habe noch nicht mit einer guten Lösung zu dieser Situation kommen.

PHP null koaleszierende Operator !

  

$username = $_GET['user'] ?? 'nobody';

Für viele Variablen, mit einer Anforderung zu überprüfen, jeder ist frei, meine expect Funktion .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top