我经常写这行代码:
$myParam = isset($params['myParam']) ? $params['myParam'] : 'defaultValue';
通常,它会使嵌套数组的行非常长。
我可以缩短它吗?
答案 0 :(得分:14)
function getOr(&$var, $default) {
if (isset($var)) {
return $var;
} else {
return $default;
}
}
$myParam = getOr($params['myParam'], 'defaultValue');
请确保通过引用传递变量,否则代码将生成E_NOTICE。此外,有意使用if / else而不是三元运算符,因此如果您使用PHP<可以共享zval。 5.4.0RC1。
答案 1 :(得分:3)
是的,通过制作代理功能,但它真的值得吗?
此外,isset
是一种语言结构,因此将其包含在代理函数将降低性能,尽管降级可能不会轻微(甚至不值得一提)。
答案 2 :(得分:3)
PHP 7将包含完全相同的??
运算符。
请参阅https://wiki.php.net/rfc/isset_ternary,示例:
// Fetches the request parameter user and results in 'nobody' if it doesn't exist
$username = $_GET['user'] ?? 'nobody';
// equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
答案 3 :(得分:1)
这就是我使用的:
function getindex($arr, $index, $default = null) {
return isset($arr[$index]) ? $arr[$index] : $default;
}
答案 4 :(得分:0)
从PHP 5.3起,您可以使用:
$myParam = $params['myParam'] ?: 'defaultValue';
但请注意,$params['myParam']
和isset($params['myParam'])
不是100%相同。
答案 5 :(得分:0)
没有。不幸的是,你不能。不是一个体面的方式。你至少必须屈服于表现。
更新:自PHP7起,??
就可以做到这一点。见https://wiki.php.net/rfc/isset_ternary
答案 6 :(得分:0)
我正在使用这个作为变量
的小魔法类class Post() {
private $post = Array();
public function __construct() {
$this->post = $_POST;
}
public function __get($name) {
return @$this->post[$name];
}
public function __set($name, $value) {
return $this->post[$name] = $value;
}
public function __call($function, $params) {
if(isset($this->post[$function])) {
return $this->post[$function];
} else {
$this->post[$function] = $params[0];
return $params[0];
}
}
}
$post = new Post();
然后在文档中,您可以轻松地将其用作任何其他变量,例如$post->name
$post->somelist[2]
或默认值$post->name("John Doe")
,然后返回并存储。< / p>
答案 7 :(得分:0)
我知道这并没有缩短你的任何内容,但我认为我只是分享这个,我在我的应用程序中使用了很多,以确保设置了一些东西,并且有价值。
function is_blank($var = NULL){
return empty($var) && !is_numeric($var) && !is_bool($var);
}
function chk_var($var = NULL){
return (isset($var) && !is_null($var) && !is_blank($var));
}
则...
if(chk_var($myvar)){ ... }
答案 8 :(得分:-1)
如果你经常这样做,你可能会忽略这一点。
事实上,变量应在使用前定义 所以,如果你的参数未定义,就不会出现这种情况 只需创建一个默认的params文件,并初始化每个变量。
$params['myParam'] = 'defaultValue';
以后它可以在某些情况下改变,但它永远不会被定义 有了主意吗?