2015-12-18 7 views
12

Questo question mi ha fatto incuriosire sull'uso di costrutti del linguaggio in combinazione con i metodi magici di PHP. Ho creato un codice demo:PHP Uso dei costrutti del linguaggio in combinazione con i metodi magici

<?php 
class Testing { 

    public function scopeList() { 
     echo "scopeList"; 
    } 

    public function __call($method, $parameters) { 
     if($method == "list") { 
      $this->scopeList(); 
     } 
    } 

    public static function __callStatic($method, $parameters) { 
     $instance = new static; 
     call_user_func_array([$instance, $method], $parameters); 
    } 
} 

//Testing::list(); 
$testing = new Testing(); 
$testing->list(); 

Perché Testing::list() gettare un errore di sintassi e non lo fa?

A causa di php reserved keywords entrambi dovrebbero fallire?

+0

Anche se funziona in questo modo: 'Test :: { 'lista'}();' –

+0

Il tutta la questione potrebbe essere ridotta agli ultimi due paragrafi. Non c'è davvero alcun punto nel leggere e comprendere quel campione di codice. – deceze

+0

@deceze forse potrebbe. Ma penso che un esempio abbia senso qui per chiarezza? Volevo mostrare, come funzionano i metodi magici in questo esempio ... –

risposta

3

Aggiorna PHP 7

PHP 7 affrontato il problema descritto e implementato una funzionalità denominata contesto lexer sensibile come allevato da marcio.

Il codice sarà semplicemente lavorare con PHP 7.


Situazione prima PHP 7

Gli errori di sintassi sono gettati prima di PHP è nemmeno a conoscenza del fatto che un metodo è disponibile attraverso __callStatic(), succede allo stadio di analisi.

Il comportamento che hai descritto sembra essere un bug nel parser PHP, almeno un'incoerenza che dovrebbe essere descritta nella documentazione.

Vorrei file a bug report. Buona pesca!


Update: Il PO ha un bug report che può essere trovato qui: identificatori sensibili https://bugs.php.net/bug.php?id=71157

+0

grazie per il tuo contributo. Avevo sempre in mente che poteva essere un bug nel parser, ma non ne avevo la conoscenza per esserne sicuro. –

+0

Siete i benvenuti! Ancora una volta, buona cattura. Sfortunatamente il programmatore (PHP) non può fare nulla qui, tranne evitare di usare parole chiave riservate. Mi piacerebbe sentire l'opinione dello sviluppatore principale di PHP su questo, voglio dire se avrebbero fatto una correzione o dire di non usare 'list' in quel contesto. – hek2mgl

+0

Sì, sono interessato a questo genere di cose;) Altrimenti non farei ricerche. Ho presentato una segnalazione di errore, ma solo in caso di "problemi di documentazione". Penso che non sia un bug 'reale' ma piuttosto un'incongruenza. –

0

A mio parere è perché le parole riservate,

se si sostituisce Testing::list(); con call_user_func_array(['Testing', 'list'], []); funziona come previsto.

+1

ho familiarità con le parole riservate, ecco perché ho postato il link alla documentazione php. Ma perché fallisce se chiamo list() staticamente e non lo faccio se chiamo lista su un oggetto reale? Il metodo magico __callStatic() dovrebbe gestirlo. –

+0

Anche se in effetti non è una risposta al problema, lo escludo perché offre una soluzione che potrebbe essere interessante per gli altri che inciampano su questo. – hek2mgl

3

contesto sono ora supportati per PHP 7.0+ e il tuo codice sarebbe semplicemente lavorare. L'aggiornamento del PHP risolverà il problema.

Questa era la RFC approvata che ha apportato la modifica: https://wiki.php.net/rfc/context_sensitive_lexer.

È possibile ottenere ulteriori informazioni sulle nuove funzionalità e le modifiche che si infrangono sulla seguente (non ufficiale) di PHP 7 di riferimento: https://github.com/tpunt/PHP7-Reference#loosening-reserved-word-restrictions

+1

Oh, non lo sapevo. Questa dovrebbe essere la risposta accettata. – hek2mgl

+0

grazie per le tue informazioni;) Php 7.0 tuttavia è dovuto al fatto che i restsrictions di hosting non sono ancora una scelta per me (e forse anche per molti altri). E come ho detto, ero a conoscenza delle restrizioni delle parole chiave riservate, ma il caso nell'OP sembrava piuttosto strano e non coerente con me. –

Problemi correlati