Условный оператор PHP и самоопределение - PullRequest
3 голосов
/ 19 августа 2009

Считается ли такая вещь нормальной в PHP?

$foo = $_GET['foo'];
$foo = empty($foo) || !custom_is_valid($foo) ? 'default' : $foo;

Есть ли более чистые альтернативы этому? Я в основном пытаюсь избежать дополнительных поисков за столом.

Ответы [ 5 ]

3 голосов
/ 19 августа 2009

Проверяет ли custom_is_valid () пустую переменную? Потому что возможность удалить empty () и «или нет» будет иметь большое значение для улучшения этого кода.

2 голосов
/ 19 августа 2009

Как вы увидите, если вы включите error_reporting(E_ALL), это не самый лучший способ сделать это. PHP в основном хочет, чтобы вы сделали

$foo = empty($_GET['foo']) || !custom_is_valid($_GET['foo']) ? 'default' : $_GET['foo'];
0 голосов
/ 19 августа 2009

Класс здесь сделает вашу жизнь намного проще.

<?php

class ParamHelper
{
  protected $source;

  public function __construct( array $source )
  {
    $this->source = $source;
  }

  public function get( $key, $default=null, $validationCallback=null )
  {
    if ( isset( $this->source[$key] ) && !empty( $this->source[$key] ) )
    {
      if ( is_null( $validationCallback ) || ( !is_null( $validationCallback ) && call_user_func( $validationCallback, $this->source[$key] ) ) )
      {
        return $this->source[$key];
      }
    }
    return $default;
  }
}

// Just for the demo
function validateUpper( $value )
{
  return ( $value == strtoupper( $value ) );
}

// Mimic some query-string values
$_GET['foo'] = 'bar';
$_GET['bar'] = 'BAZ';
$_GET['lol'] = 'el oh el';

$getHelper = new ParamHelper( $_GET );

echo $getHelper->get( 'foo', 'foo default', 'validateUpper' ), '<br>';
echo $getHelper->get( 'bar', 'bar default', 'validateUpper' ), '<br>';
echo $getHelper->get( 'baz', 'baz default' ), '<br>';
echo $getHelper->get( 'lol' ), '<br>';
echo $getHelper->get( 'rofl' ), '<br>';
0 голосов
/ 19 августа 2009

Возможно, вместо того, чтобы просто проверить, является ли он действительным, запустите его через функцию очистки, которая принимает значение по умолчанию.

Кроме того, мне нравится использовать следующую функцию, чтобы не получать предупреждения о доступе к несуществующим ключам массива при запуске E_STRICT:

function GetVar($var, $default = '') {
  $value = $default;
  if(isset($_GET[$var])) {
    $value = $_GET[$var];
  }
  return $value;
}

function custom_clean($value, $default = '') {
  ... validation logic or return $default ...
}

$foo = custom_clean(GetVar('foo'), 'default');
0 голосов
/ 19 августа 2009

Как насчет:

$foo = 'default';
if (array_key_exists('foo', $_GET) and custom_is_valid($_GET['foo'])) {
    $foo = $_GET['foo'];
}

И не бойтесь поиска в массиве, он не такой медленный:)

...