【发布时间】:2010-11-21 01:29:56
【问题描述】:
这种事情在 PHP 中被认为可以吗?
$foo = $_GET['foo'];
$foo = empty($foo) || !custom_is_valid($foo) ? 'default' : $foo;
有没有更清洁的替代品?我基本上是在尝试避免额外的表格查找。
【问题讨论】:
标签: php variable-assignment conditional-operator
这种事情在 PHP 中被认为可以吗?
$foo = $_GET['foo'];
$foo = empty($foo) || !custom_is_valid($foo) ? 'default' : $foo;
有没有更清洁的替代品?我基本上是在尝试避免额外的表格查找。
【问题讨论】:
标签: php variable-assignment conditional-operator
custom_is_valid() 是否检查空变量?因为能够删除 empty() 和“或不”对改进代码大有帮助。
【讨论】:
$_GET['foo'] 不存在,它仍然会抛出警告。
如果您打开error_reporting(E_ALL),您将会看到,这并不是最好的方法。 PHP基本上是想让你做的
$foo = empty($_GET['foo']) || !custom_is_valid($_GET['foo']) ? 'default' : $_GET['foo'];
【讨论】:
error_reporting(E_ALL | E_STRICT) 运行,并消除 PHP 抱怨的任何内容,因为生成这些警告非常慢。
怎么样:
$foo = 'default';
if (array_key_exists('foo', $_GET) and custom_is_valid($_GET['foo'])) {
$foo = $_GET['foo'];
}
不要害怕数组查找,它们并没有那么慢 :)
【讨论】:
也许不只是检查它是否有效,而是通过一个采用默认值的清理函数来运行它。
另外,我喜欢使用以下函数,因此在运行 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');
【讨论】:
这里的课程会让你的生活更轻松。
<?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>';
【讨论】: