Impossibile utilizzare il valore restituito dal metodo nel contesto di scrittura


465

Penso che il seguente pezzo di codice dovrebbe funzionare, ma non funziona (modificato: ora funziona in PHP 5.5+) :

if (!empty($r->getError()))

Dov'è getError()semplicemente:

public function getError()
{
    return $this->error;
}

Eppure finisco con questo errore:

impossibile utilizzare il valore restituito dal metodo nel contesto di scrittura

Cosa significa questo? Non è solo una lettura?


2
Probabilmente in PHP 5.5 ti sarà permesso di passare espressioni a empty: wiki.php.net/rfc/empty_isset_exprs
Carlos Campderrós


Ok, trovo che la risposta di porneL sia corretta anche questo mio codice if ( !$e->find('div') ) che controlla se l'elemento DOM HTML corrente è vuoto o meno. Lo uso all'interno del ciclo per stampare solo un singolo Div senza interno Div al suo interno.
Salem,

Risposte:


769

empty() deve accedere al valore per riferimento (per verificare se quel riferimento punta a qualcosa che esiste) e PHP prima della 5.5 non supportava riferimenti a valori temporanei restituiti da funzioni.

Tuttavia, il vero problema che hai è che lo usi empty()affatto, credendo erroneamente che il valore "vuoto" sia diverso da "falso".

Vuoto è solo un alias per !isset($thing) || !$thing. Quando la cosa che stai controllando esiste sempre (nei risultati PHP delle chiamate di funzione esistono sempre), la empty()funzione non è altro che un operatore di negazione .

PHP non ha il concetto di vuoto . I valori che valutano false sono vuoti, i valori che valutano true sono non vuoti. È la stessa cosa. Questo codice:

$x = something();
if (empty($x)) 

e questo:

$x = something();
if (!$x) 

ha sempre lo stesso risultato, in tutti i casi, per tutti i tipi di dati (perché $xdefinito empty()è ridondante).

Il valore restituito dal metodo esiste sempre (anche se non si dispone di returnun'istruzione, il valore restituito esiste e contiene null). Perciò:

if (!empty($r->getError()))

è logicamente equivalente a:

if ($r->getError())

29
Questa è una risposta molto migliore di quella attualmente selezionata.
SystemParadox,

20
@gcb: no, il manuale di PHP dice esplicitamente che è identico: "empty () è l'opposto di (boolean) var, tranne per il fatto che non viene generato alcun avviso quando la variabile non è impostata."
Kornel,

16
La mancata generazione di una parte di avviso è piuttosto importante ... vuoto ($ var) restituirà true se è 0, '', array (), NULL o addirittura non definito. È buona pratica, in particolare in modo da poter registrare i tuoi veri avvisi senza che i file si riempiano
landon

3
Ok, ottima risposta, ma qual è il modo giusto per evitarlo, qualcuno lo sa?
Javatar,

3
@EugenMihailescu in generale è ok, ma non è strettamente equivalenti a vuoto (), perché "", 0ecc sono "vuoto", ma non nullo.
Kornel,

330

Nota: questa è una risposta molto votata con un'alta visibilità, ma tieni presente che promuove pratiche di codifica errate e inutili! Vedi la risposta di @ Kornel per il modo corretto.

Nota n. 2: sottoscrivo i suggerimenti per utilizzare la risposta di @ Kornel . Quando ho scritto questa risposta tre anni fa, intendevo semplicemente spiegare la natura dell'errore, non necessariamente approvare l'alternativa. Lo snippet di codice in basso non è raccomandato.


È una limitazione di empty () nelle versioni PHP sotto la 5.5.

Nota: empty () controlla solo le variabili poiché qualsiasi altra cosa provocherà un errore di analisi. In altre parole, non funzionerà: vuoto (trim ($ name)).

Dovresti cambiare in questo

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))

156
Questo è follemente controproducente.
David Murdoch,

47
Nota: lo stesso vale per isset(). cioè: isset($this->foo->getBar())comporterà lo stesso problema.
catchdave,

7
La risposta di porneL lo spiega in modo più dettagliato, con una soluzione migliore
SystemParadox,

5
@SystemParadox - Dipende da cosa intendi per "migliore". La risposta di PorneL è probabilmente più approfondita con una soluzione "più pulita", ma in realtà non spiega nemmeno l'origine dell'errore.
Peter Bailey,

4
Perché non è sbagliato, @deceze. Non è la risposta migliore, non avrai nessuna discussione da me lì. Ho anche votato per me stesso. È una risposta molto vecchia ma non è sbagliata . Per quanto riguarda i voti alti: ricorda, PorneL è arrivato quasi 17 mesi dopo questo.
Peter Bailey,

37

Secondo i documenti PHP :

empty () controlla solo le variabili poiché qualsiasi altra cosa comporterà un errore di analisi

Non è possibile utilizzare empty()direttamente sul valore restituito di una funzione. Invece, imposta il ritorno da getError()su una variabile ed eseguilo empty()sulla variabile.


19

Di solito creo una funzione globale chiamata is_empty () solo per aggirare questo problema

function is_empty($var)
{ 
 return empty($var);
}

Quindi dovunque normalmente avrei usato empty () Uso solo is_empty ()


2
È meglio non farlo e attenersi agli standard (per quanto fastidiosi possano essere).
tonyhb,

1
@dynamism potresti spiegarmi perché no?
Janis Veinbergs,

1
Perché le funzioni di convenienza possono essere un problema leggere nel codice di qualcun altro. Inoltre, in un'architettura MVC / HMVC può rovinare la tua struttura. Alla fine della giornata, i programmatori PHP dovrebbero sapere quali sono i limiti ed essere in grado di comprendere piccole soluzioni alternative senza funzioni di convenienza.
tonyhb,

14
Wow, hai appena inventato una funzione di negazione . Sai PHP ha un !operatore per questo? :)
Kornel,

4

Come sottolineato da altri, è una (strana) limitazione di empty ().

Per la maggior parte delle ipotesi, fare questo equivale a chiamare vuoto, ma funziona:

if ($r->getError() != '')

5
Questo non è vero - empty()copre molte più possibilità di una semplice stringa vuota
Robbie Averill

3
Ecco perché dice "per la maggior parte degli scopi ", non tutti
Jani Hartikainen,

2

Il problema è questo, vuoi sapere se l'errore non è vuoto.

public function getError() {
    return $this->error;
}

L'aggiunta di un metodo isErrorSet () risolverà il problema.

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

Ora funzionerà bene con questo codice senza preavviso.

if (!($x->isErrorSet())) {
    echo $x->getError();
}

-3

Il modo alternativo per verificare se un array è vuoto potrebbe essere:

count($array)>0

Funziona per me senza quell'errore

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.