2011-01-12 10 views
72

sto ottenendo l'avvertimento: Call-time pass-by-reference has been deprecated per le seguenti righe di codice:avvertimento PHP: Call-time pass-by-di riferimento è stato deprecato

function XML() { 
    $this->parser = &xml_parser_create(); 
    xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, false); 
    xml_set_object(&$this->parser, &$this); 
    xml_set_element_handler(&$this->parser, 'open','close'); 
    xml_set_character_data_handler(&$this->parser, 'data'); 
} 
function destruct() { 
    xml_parser_free(&$this->parser); 
} 
function & parse(&$data) { 
    $this->document = array(); 
    $this->stack = array(); 
    $this->parent = &$this->document; 
    return xml_parse(&$this->parser, &$data, true) ? $this->document : NULL; 
} 

Che cosa provoca e come risolvere il problema?

+0

Rif: [Riferimento - Che cosa significa questo errore in PHP?] (Http://stackoverflow.com/q/12769982/367456) – hakre

+0

Related pagina di manuale: [Passaggio per riferimento ] (http://php.net/manual/en/language.references.pass.php) – Palec

risposta

142

Rimuovere & da &$this ovunque, non è necessario. In realtà, penso che è possibile rimuovere & ovunque in questo codice - non è necessario a tutti.

lunga spiegazione

PHP permette di passare le variabili in due modi: "per valore" e "di riferimento". Primo modo ("per valore"), non si possono modificare, altro secondo modo ("di riferimento") è possibile:

 function not_modified($x) { $x = $x+1; } 
    function modified(&$x) { $x = $x+1; } 

Nota il segno &. Se chiamo modified su una variabile, che sarà modificata, se chiamo not_modified, dopo che restituisce il valore dell'argomento sarà lo stesso.

La versione precedente di PHP consentiva di simulare il comportamento di modified con not_modified nel modo seguente: not_modified(&$x). Questo è "tempo di chiamata per riferimento". È deprecato e non dovrebbe mai essere usato.

Inoltre, in versioni PHP molto antiche (leggi: PHP 4 e precedenti), se si modificano gli oggetti, è necessario passarlo per riferimento, quindi l'uso di &$this. Questo non è né necessario, né raccomandato più, come oggetto sono sempre modificato quando passò alla funzione, vale a dire questo funziona:

function obj_modified($obj) { $obj->x = $obj->x+1; } 

Questo sarebbe modificare $obj->x anche se formalmente è passato "per valore", ma ciò che è passato è oggetto gestire (come in Java, ecc.) e non la copia dell'oggetto, come era in PHP 4.

Ciò significa che, a meno che non si stia facendo qualcosa di strano, non è quasi mai necessario passare l'oggetto (e quindi $this per riferimento, che si tratti di call-time o altro). In particolare, il tuo codice non ne ha bisogno.

+0

Posso anche sottolineare che l'errore sopra menzionato verrà mostrato se provate a chiamare una funzione usando 'call_user_func ('myfunc') , & $ param) ', ma non se si utilizza' call_user_func_array ('myfunc', array (& $ param)) '. Non so ** perché ** se, però, qualcuno vuole fare luce :) –

+1

@MattFletcher Poiché il primo è la sintassi del riferimento alla chiamata, che è stata deprecata per un lungo periodo di tempo.Quest'ultimo è solo il passaggio di argomenti a una funzione (che capita di essere call_user_func_array) quindi non c'è niente di sbagliato in questo. Quindi sì, puoi usare quest'ultima sintassi per fare una forma sotto il radar di riferimento call-time, o puoi usarla per scopi legittimi - come fare wrapper per le funzioni di variabile-arg per-ref (i collegamenti parametrizzati in PDO possono essere un esempio). Il diff è ex non è sempre legittimo e non è necessario, quest'ultimo può essere legittimo o non legittimo in base all'utilizzo. – StasM

+2

'Primo modo, è possibile modificarli, altrimenti non è possibile il contrario :) –

20

Solo nel caso vi stiate chiedendo, un passaggio delle chiamate in tempo per riferimento è una funzione PHP obsoleto che promuove PHP digitazione sciolto. Fondamentalmente, ti permette di passare un riferimento (un po 'come un puntatore C) a una funzione che non ne ha specificatamente richiesto uno. È la soluzione di PHP per il piolo quadrato in un problema di buco rotondo.
Nel tuo caso, mai riferimento $this. Al di fuori di una classe, un riferimento al suo $this non consentirà di accedere sia i metodi privati ​​e campi.

Esempio:

<?php 
function test1($test) {} //This function doesn't want a reference 
function test2(&$test) {} //This function implicitly asks for a reference 

$foo = 'bar'; 
test2($foo); //This function is actually given a reference 
test1(&$foo); //But we can't force a reference on test1 anymore, ERROR 
?> 
+3

" Fondamentalmente, consente di passare un riferimento (un po 'come un puntatore C) a una funzione che non è stata specificatamente richiesta per uno." <- Questa è la roba buona. Grazie. – RobW

+0

Giusto per essere chiari, i riferimenti PHP non sono affatto come i puntatori C. Sono più come collegamenti fissi UNIX, se hai bisogno di un'analogia. – StasM

Problemi correlati