12

有没有一种简洁的方法来检查是否设置了变量,然后在不重复相同变量名的情况下回显它?

而不是这个:

<?php
    if(!empty($this->variable)) {
        echo '<a href="', $this->variable, '">Link</a>';
    }
?>

我正在考虑这个 C 风格的伪代码中的一些内容:

<?php
    echo if(!empty($this->variable, '<a href="', %s, '">Link</a>'));
?>

PHP 有sprintf,但它并没有达到我的预期。如果我当然可以用它制作一个方法/功能,但肯定有一种方法可以“原生”地做到这一点?

更新:三元运算也会重复这$this->variable部分,如果我理解的话?

echo (!empty($this->variable) ? '<a href="',$this->variable,'">Link</a> : "nothing");
4

3 回答 3

19

最接近您正在寻找的内容是使用短形式的三元运算符(自 PHP5.3 起可用)

echo $a ?: "not set"; // will print $a if $a evaluates to `true` or "not set" if not

但这会触发“未定义变量”通知。你显然可以用它来压制@

echo @$a ?: "not set";

不过,这不是最优雅/干净的解决方案。

所以,你可以期望的最干净的代码是

echo isset($a) ? $a: '';
于 2013-04-12T11:46:14.770 回答
17

更新:

PHP 7 引入了一个新特性:空合并运算符

这是来自 php.net 的示例。

<?php
// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';
// This is equivalent to:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

// Coalescing can be chained: this will return the first
// defined value out of $_GET['user'], $_POST['user'], and
// 'nobody'.
$username = $_GET['user'] ?? $_POST['user'] ?? 'nobody';
?>

对于那些还没有使用 PHP7 的人来说,这是我原来的答案......

我使用一个小功能来实现这一点:

function ifset(&$var, $else = '') {
  return isset($var) && $var ? $var : $else;
}

例子:

$a = 'potato';

echo ifset($a);           // outputs 'potato'
echo ifset($a, 'carrot'); // outputs 'potato'
echo ifset($b);           // outputs nothing
echo ifset($b, 'carrot'); // outputs 'carrot'

警告:正如 Inigo 在下面的评论中指出的那样,使用此函数的一个不良副作用是它可以修改您正在检查的对象/数组。例如:

$fruits = new stdClass;
$fruits->lemon = 'sour';
echo ifset($fruits->peach);
var_dump($fruits);

将输出:

(object) array(
  'lemon' => 'sour',
  'peach' => NULL,
)
于 2014-05-27T23:02:23.483 回答
-1

像这样使用isset php的功能:

<?php

  echo $result = isset($this->variable) ? $this->variable : "variable not set";

 ?>

我认为这会有所帮助。

于 2013-04-12T11:38:22.250 回答