PHP 条件运算符和自我赋值

3
这种事在PHP中是否被视为可行的?
$foo = $_GET['foo'];
$foo = empty($foo) || !custom_is_valid($foo) ? 'default' : $foo;

有没有更干净的替代方案?我基本上想避免额外的表查找。
5个回答

3

custom_is_valid()函数是否检查空变量?如果能够去掉empty()和“or not”,将有助于改善该代码。


如果$_GET['foo']不存在,它仍会引发警告。 - chaos
只使用 "$foo = custom_is_valid($_GET['foot']);",并在 custom_is_valid(..) 中检查数据,好吗? - andres descalzo

2

如果你开启error_reporting(E_ALL),你会发现这并不是最好的方法。PHP基本上希望你这样做:

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

PHP规范是否对表格查找提供任何性能保证? - T9300X
3
我无法想象是什么让你认为有一个 PHP 规范。:/ - chaos
我不知道。 ;) 我有 C++ 的背景,几个小时前刚开始学习 PHP。 - T9300X
1
啊。 :) 是的,PHP的定义不是非常严格。我怀疑这三个查找的性能不会很好,但它比让PHP生成警告要好(无论是否抑制显示)。如果您关心性能,基本上应始终运行error_reporting(E_ALL | E_STRICT),并消除PHP抱怨的任何内容,因为生成这些警告相当缓慢。 - chaos
实际上,与典型脚本执行的其他任务相比,额外的查找成本微不足道;您无法测量任何差异。 - bobince

0
怎么样:
$foo = 'default';
if (array_key_exists('foo', $_GET) and custom_is_valid($_GET['foo'])) {
    $foo = $_GET['foo'];
}

不要害怕数组查找,它们并不那么慢 :)


0
也许不仅仅是检查是否有效,而是通过一个清理函数来运行它,并设置默认值。
另外,我喜欢使用以下函数,这样在运行 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
在这里使用一个类会让你的生活变得更加轻松。
<?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>';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接