2016-05-31 8 views
6

L'errore è stato aggiunto nel PHP7 e ho problema con tale codice come:C'è un interruttore per disabilitare l'errore "non è possibile utilizzare l'espressione temporanea in contesto di scrittura"?

(some complex expression)->my_property = 1 

Si prega di notare Sto assegnando al campo dell'oggetto, non l'oggetto stesso (assegnando ad oggetto temporaneo non rende senso, sono d'accordo, ma qui è non il caso).

Questo mi dà un errore "non è possibile utilizzare l'espressione temporanea nel contesto di scrittura". Quando ho riscrivere questo come:

$tmp = (some complex expression); 
$tmp->my_property = 1; 

tutto bene. Il problema è che devo avere una singola espressione (l'assegnazione è un'espressione) e poiché PHP non supporta l'operatore virgola ora sono tostato con due dichiarazioni .

Per me questa è un'enorme differenza, perché non riesco a passare l'intero codice come espressione ulteriore. Tutto è valido all'interno di quella "espressione complessa", quindi mi piacerebbe semplicemente disabilitare quel controllo in PHP.

È possibile? Come?

Il mio codice è scritto automaticamente (è generato) e il risultato dell'espressione è un oggetto PHP valido, il problema è PHP in qualche modo non se ne accorge. Inoltre, il secondo modulo funziona.

Update: questo è un esempio di un'espressione complessa che ho citato sopra:

(($a = foo()) === 0 ? $a : bar()) 
+0

che cosa esattamente restituisce/fa questa espressione complessa? dato l'errore, stai provando a fare qualcosa come '1 + 1 = 2', che proverebbe ad assegnare' 2' al risultato di '1 + 1' - che sarebbe un valore temporaneo, dal momento che non è memorizzato ovunque, e stai tentando di scrivere su di esso, causando l'errore. –

+0

@MarcB, ho aggiornato la domanda, il tuo confronto non è corretto (un po '), perché sto assegnando un campo, non l'oggetto. Quindi, anche se l'oggetto è temporaneo, è ben noto quando si tratta di accedere al campo, ed è il campo che viene assegnato (alterato), non l'intero oggetto. – greenoldman

+0

@MarcB La differenza è che gli oggetti vengono passati per riferimento, non per copia, quindi se un'espressione restituisce un oggetto è valido da assegnare a una proprietà. – Barmar

risposta

3

ho intenzione di dire di no.

Tutto è valido all'interno di quella "espressione complessa", quindi mi piacerebbe semplicemente disabilitare tale controllo in PHP.

Credo che il problema qui è che non consentire la scrittura di espressioni temporanei non è semplicemente un "check" in PHP, ma una parte del linguaggio a partire dal 7.1 (introdotto nel 5c2120b).

A partire dal 5c2120b, la grammatica di lingua è stato aggiornato a ridefinire ciò che è deferenceable come:

dereferencable: 
     variable    { $$ = $1; } 
    | '(' expr ')'   { $$ = $2; zend_do_begin_variable_parse(TSRMLS_C); $$.EA = 0; } 
    | dereferencable_scalar { $$ = $1; zend_do_begin_variable_parse(TSRMLS_C); $$.EA = 0; } 
; 

- Source on GitHub

Inoltre, si noterà che le fonti di tali errori nel codice di base don controllare qualsiasi cosa prima di produrre un errore, ad es 1 e 2.

La soluzione alternativa sarebbe il downgrade a una versione di PHP che consentiva questo.

+0

Grazie, ma "dereferenziabile" significa che posso scrivere 'a-> b' quando' a' è dereferenziabile. Quindi ho un'espressione come 'a' (la seconda riga). E questo è corretto, PHP si lamenta di un incarico, non di un dereferenziamento. – greenoldman

+0

È comunque necessario trasferire la variabile temporanea per poterne assegnare un valore. Detto questo, @NikiC potrebbe essere in grado di fare più luce sul cambiamento in cui è stato il loro commit. – Whymarrh

6

avevo questo errore venire mentre il refactoring del codice scritto male:

class MyClass { 

    static $cache = []; 

    public function myFunction() { 
      $this->cache['foo'] = 'bar'; 
    } 

ho riscritto questo per risolvere il riferimento non statico a $cache all'interno myFunction:

class MyClass { 

    static $cache = []; 

    public function myFunction() { 
      self::cache['foo'] = 'bar'; 
    } 

Avviso ho perso il $ e avrebbe dovuto scrivere self::$cache['foo'].

Questo ha prodotto l'errore cannot use temporary expression in write context, che non era particolarmente utile. Nel mio caso non c'era nulla di sbagliato in quello che stavo cercando di fare, solo semplice errore di battitura.

1

Questo è molto semplice da capire. Quando si tenta di chiamare Someclass :: somevar, significa che si sta tentando di chiamare "const" var dalla classe, la variabile costante, come "define()", ma all'interno della classe. Ma quando si chiama Someclass :: $ somevar, si chiama var "statico", simile all'oggetto $ someclass-> somevar. Questa è solo una spiegazione molto semplice per principianti o php-dummies. Per ulteriori informazioni, vi sono alcuni esempi http://php.net/manual/en/language.oop5.static.php

+0

A quale domanda stai rispondendo? Non ho usato la sintassi con "::" (accesso statico). – greenoldman

Problemi correlati