Pergunta

I encontrar em minhas páginas PHP eu acabar com linhas e linhas de código que olhar como esta:

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

Existe uma melhor, mais conciso, ou forma mais legível para verificar essa matriz e atribuí-los a uma variável local, se eles existem ou aplicar um padrão, se eles não?

EDIT: Eu não quero usar register_globals() - Eu ainda tenho o problema isset qualquer maneira

.
Foi útil?

Solução

Como cerca de envolvê-lo em uma função?

<?php

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

Outras dicas

um método melhor poderia ser a de criar um singleton / classe estática para abstrair os detalhes de verificar os dados de solicitação.

Algo como:

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

então você pode fazer:

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

Eu acho que isso faz com que seus scripts cargas indivíduo mais limpo e abstrai a validação etc. além de cargas de âmbito com este projeto para estendê-lo / adicionar comportamentos alternativos, adicione padrão mais complicado lidar com etc etc.

Em primeiro lugar, o uso $_POST para variáveis ??enviado. $_REQUEST é um mashup de muitas variáveis ??de entrada diferentes, não apenas $_POST e poderia causar problemas.

Uma solução para sua pergunta seria a criação de uma função que lida com a lógica isset().

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

Antes de mais nada, NUNCA usar a variável $ _REQUEST, ele vai levar a bugs e outros problemas durante o desenvolvimento


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

note that this code leaves the variable empty when $_POST[$key] não foi definido

Você também pode adaptar esse código para que você possa em vez disso fornecer-lhe um padrão (sensível), quando o valor não pôde ser carregado.

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

É o conjunto de variáveis ??que você está esperando conhecidos no momento da escrita do roteiro, ou você quer fazer isso para um conjunto arbitrário de valores? Se a primeira é verdadeira, você poderia fazer algo parecido com isto:

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

Basicamente, isso leva vantagem da capacidade do PHP para avaliar variáveis ??para criar outras variáveis ??(daí o double-dollar for $$ chave - isto significa criar uma nova variável cujo nome é o valor de $ key).

Eu ainda não chegar a uma boa solução para a última situação.

operador coalescentes do PHP !

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

Para uma série de variáveis, com um cheque exigência, qualquer um é livre para usar a minha função expect .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top