2013-04-12 8 views
6

Esiste un modo conciso per verificare se una variabile è impostata, quindi echo senza ripetere lo stesso nome di variabile?Controllare se la variabile è impostata e quindi echo senza ripetere?

Invece di questo:

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

sto pensando a qualcosa nelle linee di questo stile C pseudocodice:

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

PHP ha sprintf, ma non abbastanza fare quello Speravo. Se naturalmente potrei farne un metodo/una funzione, ma sicuramente ci deve essere un modo per farlo in modo "nativo"?

Aggiornamento: Le operazioni ternarie ripetono anche la parte $this->variable, se l'ho capita?

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

Io non sono a conoscenza di alcuna scorciatoia per questo. Se la usi molto, ti consiglio comunque di creare una funzione per questo. – str

+0

Operazione ternaria (valore '(bool)?: Default') non è un'opzione? – BlitZ

risposta

0

Utilizzare la funzione isset di PHP in questo modo:

<?php 

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

?> 

Penso che questo sarà di aiuto.

+0

La variabile '$ this- >' si ripeterà ancora nella parte" fa qualcosa ". Mi piacerebbe farlo senza ripeterlo più volte nel comando. (il downvote non era il mio ...) –

+0

ho modificato la mia risposta per favore controlla ora. – saveATcode

13

Il più vicino si può arrivare a ciò che si sta cercando è tramite il modulo a corto di operatore ternario (disponibile dal PHP5.3)

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

Ma questo innescherà avviso "Variabile non definita". Il che ovviamente è possibile sopprimere con @

echo @$a ?: "not set"; 

Eppure, non il più elegante/soluzione pulita.

Quindi, il codice più pulito si può sperare è

echo isset($a) ? $a: ''; 
+1

Spesso userò una tecnica simile a questa ma con vuoto che tiene conto anche delle stringhe vuote – christian

+0

Buon pensiero. Peccato che non ci sia una funzione PHP integrata e sorprendente. –

10

Aggiornamento:

PHP 7 introduce una nuova funzionalità: Null coalescing operator

Ecco l'esempio da 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'; 
?> 

Per coloro che non utilizzano ancora PHP7 Ecco la mia risposta originale ...

Io uso una piccola funzione per raggiungere questo obiettivo:

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

Esempio:

$a = 'potato'; 

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

Caveat: Come sottolineato da Inigo in un commento sottostante, un effetto collaterale indesiderato dell'utilizzo di questa funzione è che può modificare l'oggetto/array che si sta ispezionando.Per esempio:

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

Will uscita:

(object) array(
    'lemon' => 'sour', 
    'peach' => NULL, 
) 
+1

Ho pensato anche a questo. Tuttavia, si pone il seguente problema: $ data = []; $ data ['a'] = 2; ifset di eco ($ data ['b']); var_dump ($ data); Restituisce array (2) {["a"] => int (2) ["b"] => NULL}. Quindi la funzione ifset modifica effettivamente l'oggetto dati originale ... – Inigo

+1

Hai perfettamente ragione Inigo - Non me ne ero mai reso conto, in quanto generalmente non lo uso con gli array. Sembra che dovremo aspettare fino a quando non utilizzeremo PHP7 per una soluzione che sicuramente non modifica l'oggetto originale. –