Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Magico problema col magico metodo __get()

    Questo il pezzo di codice:
    codice:
    echo $node->end;
    while($node != NULL)
    {
    $cutLength = $node->end - $node->start + 1;
    ...
    ...
    }
    Quando la seconda volta, dentro il ciclo, provo ad accedere alla proprietà end dell'oggetto $node, ottengo questo:
    Fatal error: Cannot access protected property TagNode::$_end in blablabla on line blablabla

    La cosa divertente è che quando vi accedo fuori dal ciclo, alla prima riga (echo $node->end) non mi dà nessun errore e accede alla proprietà senza battere ciglio.

    Informazioni utili:
    - $node è un oggetto di tipo TagNode, la classe TagNode estende la classe Node;
    - nella classe Node è definita una variabile $_end protected;
    - nella classe Node uso i metodi __get() e __set() per accedere a questa variabile;
    - nella classe TagNode faccio l'overloading di questi metodi.
    - se dentro il ciclo uso esplicitamente il metodo __get('end') non mi dà errore, ma prima dal ciclo non è necessario.

    Qualche spiegazione plausibile a questo comportamento?
    Grazie.

  2. #2
    sembrerebbe un bug del php, perché richiamando le stesse identiche istruzioni fuori da un loop (copincollandole più volte) tutto funziona correttamente.
    Dentro un loop non va.

  3. #3
    Hai già visto se è un bug conosciuto su bugs.php.net ?
    Addio Aldo, amico mio... [03/12/70 - 16/08/03]

  4. #4
    sì, ho dato uno sguardo, c'è qualcosa di simile, (anche col metodo __call()).

    Il problema, per quanto ho visto, si verifica quando all'interno di un ciclo una variabile diventa un oggetto diverso tra classi derivate dalla stessa radice.
    In pratica non riesce a risolvere il tipo di oggetto (e quindi i metodi da chiamare, quando in overloading) dentro al loop, cioè a runtime.

    Se invece del loop ricopio le istruzioni del blocco di codice molte volte, tutto funziona regoralmente, quindi è sicuramente un problema suo.

    Io ho dovuto risolvere brutalmente, cioè non usando i metodi __get e __set e facendo tanti metodi appositi getVariabile e setVariabile alla maniera classica.

  5. #5
    Utente di HTML.it L'avatar di chris
    Registrato dal
    Sep 1999
    Messaggi
    1,568
    Ah però, funziona bene questo php5

  6. #6
    Originariamente inviato da chris
    Ah però, funziona bene questo php5
    Dai, è il primo bug serio che mi capita

    Ah, se qualcuno è curioso posso agevolare un paio di righe di codice per provare il bug a casina vostra.

  7. #7
    Originariamente inviato da skidx
    Dai, è il primo bug serio che mi capita

    Ah, se qualcuno è curioso posso agevolare un paio di righe di codice per provare il bug a casina vostra.
    Agevola ... agevola..

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  8. #8
    Originariamente inviato da piero.mac
    Agevola ... agevola..
    codice:
    <?php
    
    class Prova
    {
    	protected $_data = 5;
    	
    	function __get($varName)
    	{
    		$varName = '_'.$varName;
    		return $this->$varName++;
    	}
    
    }
    
    class Prova2 extends Prova
    {
    	function __get($varName)
    	{
    		return parent::__get($varName);
    	}
    
    }
    $a = new Prova;
    $b = new Prova2;
    $c = $a;
    for($i = 0; $i < 10; $i++)
    {
    	if($c instanceof Prova2)
    		$c = $a;
    	else
    		$c = $b;
    	echo $c->data;
    }
    
    ?>
    Questo codice dà questo errore:
    Fatal error: Cannot access protected property Prova2::$_data in d:\localhost\www\buzzler\prova_static.php on line 32

    Se invece eliminate il ciclo for e prendete il blocco in grassetto, e lo ripetete N volte direttamente nel codice:
    codice:
    	if($c instanceof Prova2)
    		$c = $a;
    	else
    		$c = $b;
    	echo $c->data;
    
    	if($c instanceof Prova2)
    		$c = $a;
    	else
    		$c = $b;
    	echo $c->data;
    
    	if($c instanceof Prova2)
    		$c = $a;
    	else
    		$c = $b;
    	echo $c->data;
    
    	if($c instanceof Prova2)
    		$c = $a;
    	else
    		$c = $b;
    	echo $c->data;
    ...
    tutto funziona senza errori

  9. #9
    Copiato e incollato alla becera_style

    esito:

    5566778899

    nessun errore.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  10. #10
    Originariamente inviato da piero.mac
    Copiato e incollato alla becera_style

    esito:

    5566778899

    nessun errore.
    Versione?
    Magari l'hanno corretto (meglio così), io ho una 5.0.3 su Win2000.

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.