Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    pass by reference deprecato

    Se per qualche motivo usate la reflection o la call_user_func e dovete sfruttare una funzione PHP che gestisce le variabili by reference ... ma non vi lascia impostarle come volete causa WARNING ... questo è l'unico modo che ho trovato per raggirare l'assurdità in questione

    codice:
    function	unshift(){
    	for($ref = new ReflectionFunction('array_unshift'), $args = array(&$this->array), $arguments = func_get_args(), $i = 0, $length = count($arguments); $i < $length; $i++)
    		$args[]	= $arguments[$i];
    	return	$ref->invokeArgs($args);
    }

    mentre se usate il codice da me postato in questa pagina avrete qualche problema ... che son sicuro non risolveranno

    [edit]
    quick and dirty e probabilmente slower ...
    codice:
    function unshift(){
    	$ref		= new ReflectionFunction('array_unshift');
    	$arguments	= func_get_args();
    	return		$ref->invokeArgs(array_merge(array(&$this->arr), $arguments));
    }
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  2. #2
    Gli oggetti sono passati per riferimento in PHP 5 dunque è inutile voler forzare il passaggio per riferimento di una variabile ($this) che di fatto rappresenta un oggetto.

    Ti porto un esempio diretto.
    Guarda la modifica alla riga 271
    http://framework.zend.com/fisheye/br...&r2=7917#seg16

    In PHP 4 passi per riferimento poiché gli oggetti sono passati per valore.
    In PHP 5 il passaggio per riferimento in quel modo è deprecato ma funziona correttamente poiché gli oggetti sono passati per riferimento di default.

    Dimenticavo.
    Ho visto che i tuoi esempi sono riferiti alla chiamata di una funzione.
    Se è una funzione di PHP non puoi farci nulla, se è tua il passaggio per riferimento è possibile dichiarandolo nella funzione.

  3. #3
    Originariamente inviato da weppos
    ...
    ... uso PHP 5 da circa 3 anni ... quindi forse dovresti capire meglio il problema e/o leggerti l'esempio in bugs.php.net

    [edit] ... ti agevolo il test del problema ...
    codice:
    <?php
    $arr = array(2, 3, 4);
    
    /** EXPECTED RESULT
     * array_unshift($arr, 1);
     * array_unshift($arr, 0);
     * var_dump($arr);	// 0, 1, 2, 3, 4
     */
    
    $ref = new ReflectionFunction('array_unshift');
    
    // WARNING: Call-time pass-by-reference has been deprecated
    $ref->invoke(&$arr, 1);
    $ref->invokeArgs(array(&$arr, 0));
    var_dump($arr);	// correct and expected result
    
    // FATAL ERROR - Uncaught exception 'ReflectionException' with message
    // 'Invocation of function array_unshift() failed'
    $ref->invoke($arr, 1);
    $ref->invokeArgs(array($arr, 0));
    var_dump($arr);	// nothing, because of fatal error ... 
    
    exit;
    ?>
    il send by reference è disabilitato nel parser, ma nel core c'è ancora e come ... io la chiamo fagianata della Reflection, tu come la chiameresti?
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    Avevo aggiunto un edit, credo che ti sia sfuggito.
    Dicevo proprio questo, ovvero che se la funzione è built-in di PHP è un altro paio di maniche.

    Quello che molti non sanno - e che ho voluto sottolineare - è che è comunque possibile continuare a passare per riferimento se la funzione è dichiarata da noi spostando la & nella dichiaraione della funzione.

  5. #5
    Originariamente inviato da weppos
    Avevo aggiunto un edit, credo che ti sia sfuggito.
    Dicevo proprio questo, ovvero che se la funzione è built-in di PHP è un altro paio di maniche.

    Quello che molti non sanno - e che ho voluto sottolineare - è che è comunque possibile continuare a passare per riferimento se la funzione è dichiarata da noi spostando la & nella dichiaraione della funzione.
    non ci siamo capiti ... se tu sviluppatore di linguaggi di programmazione mi crei una ReflectionFunction io mi aspetto che questa funzioni con built-in e non.

    Grazie lostesso per la lezione sul riferimento in funzione ...

    [edit]
    Questo risolve il problema ... perchè il parser lascia inviare un solo parametro per riferimento senza rompere le scatole ...
    codice:
    $ref->invokeArgs(array_merge(array(&$array), $arguments));
    io non vedo logica in tutto questo, se per te è normale solo perchè uso una builtin a me viene da ridere per non piangere

    ... sono stra curioso di vedere cosa diranno in php.net ... ma mi aspetto la solita scusa o qualche risposta tipo la tua
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    cvd ... il bug e' aperto (seppur con poca priorita') ... ed e' diverso da quello immaginato, la Reflection sbaglia comunque (o meglio non gestisce bene) se la funzione / metodo accetta una variabile per riferimento.

    Se è una funzione di PHP non puoi farci nulla, se è tua il passaggio per riferimento è possibile dichiarandolo nella funzione.
    ... e' qualunque funzione ... nella pagina del bug trovi tutti gli esempi che vuoi, con native e non.
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.