2013-04-12 26 views
6

是否有簡明的方法來檢查是否設置了變量,然後在不重複相同變量名的情況下對其進行回顯?檢查是否設置了變量,然後不重複地回顯它?

取而代之的是:

<?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"); 
+0

我不知道任何簡寫爲的。如果你使用它很多,我會建議爲此創建一個函數。 – str

+0

三元運算('(bool)?value:default')不是一個選項嗎? – BlitZ

回答

0

使用isset PHP的功能是這樣的:

<?php 

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

?> 

我認爲這將有助於。

+0

'$ this-> variable'仍然會在「做某事」部分重複。我想這樣做,而不是在命令中重複多次。 (downvote不是我的...) –

+0

我編輯了我的答案,請現在檢查。 – saveATcode

13

你可以得到你所追求的是使用三元運算符的縮寫形式(因爲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: ''; 
+1

通常我會用一種類似於這種技術的技術,但是空的也會佔空字符串 – christian

+0

好的想法。可惜沒有內置的PHP功能,也很令人驚訝。 –

10

更新:

PHP 7引入了一個新功能:Null coalescing operator

下面是來自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, 
) 
+1

我想到了這一點。但是,出現以下問題: $ data = []; $ data ['a'] = 2; echo ifset($ data ['b']); var_dump($ data); 將返回數組(2){[「a」] => int(2)[「b」] => NULL}。因此,ifset函數實際上修改了原始數據對象... – Inigo

+1

你完全正確Inigo - 我從來沒有意識到,因爲通常不會在數組中使用它。看起來我們將不得不等待,直到我們使用PHP7來獲得絕對不會修改原始對象的解決方案。 –

相關問題