Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: referencje
Forum PHP.pl > Forum > PHP
dtb
postanowilem [z nudow] napisac sobie cos w php z czego mogl byc w przyszlosci uzywac. wpadlem na pomysl - system szablonow! jednak natrafilem na pewien problem.

oto fragmet kodu:
  1. <?php
  2. function pte_parseVar (&$var, $key, &$pte)
  3. {
  4. while (preg_match('#\(([a-zA-Z0-9\.]+)\)#', $var, $x)) {
  5. $var = str_replace($x[0], $pte->getVarValue($x[1]), $var);
  6. }
  7. $var = &$pte->getVarValue($var);
  8. }
  9.  
  10. class pte
  11. {
  12. private $vars;
  13. (...)
  14. public function getVarValue ($name)
  15. {
  16. $name = explode('.', $name);
  17. $varName = NULL;
  18. foreach ($name as $v) {
  19. $varName .= '[''.$v.'']';
  20. }
  21. return eval('return $this->vars'.$varName.';');
  22. }
  23. (...)
  24. public function parse ($file)
  25. {
  26. (...)
  27. array_walk($tmp[2], 'pte_parseVar', $this);
  28. (...)
  29. }
  30. }
  31. ?>


chodzi o to, aby $tmp[2]['zm.0'] byl referencja zmiennej $this->vars['zm'][0]; itp. jednak zamiast referencji przekazana jest jedynie zawartosc tej zmiennej. gdy dodam operator & przed eval lub przed $this->vars'.$vaName to wyskakuje blad skladni. wie ktos jak to rozwiazac?
Wave
Spróbuj:
  1. <?php
  2. public function &getVarValue ($name)
  3. ?>
dtb
kiedy dodam & przed getVarValue to zwraca dzieje sie tak jakby wogule nie bylo fragmetu $var = &$pte->getVarValue($var). kiedy zrobie $var = $pte->getVarValue($var), to jest tak ja wczesniej

~ EDIT:
przygotawalem taki kod, dzieki ktoremu mozna latwo sparwdzic czy mamy doczynienia z referencjami:

  1. <?php
  2. function pte_parseVar (&$var, $key, &$pte)
  3. {
  4.     while (preg_match('#\(([a-zA-Z0-9\.]+)\)#', $var, $x)) {
  5.         $var = str_replace($x[0], $pte->getVarValue($x[1]), $var);
  6.     }
  7.     $var = $pte->getVarValue($var);
  8. }
  9.  
  10. class pte
  11. {
  12.     private $vars;
  13.     
  14.     public function __construct ()
  15.     {
  16.         $this->vars['zm'] = array (0 => 'lol', 1 => 'lol2');
  17.     }
  18.  
  19.     public function &getVarValue ($name)
  20.     {
  21.         $name = explode('.', $name);
  22.         $varName = NULL;
  23.         foreach ($name as $v) {
  24.             $varName .= '[''.$v.'']';
  25.         }
  26.         return eval('return $this->vars'.$varName.';');
  27.     }
  28.     public function parse ()
  29.     {
  30.         $tmp[2] = array ('zm.0', 'zm.0');
  31.         array_walk($tmp[2], 'pte_parseVar', $this);
  32.         $tmp[2] = array ('nowa_wartosc', 'nw2'); // jezeli $tmp[2] to referencja do $this->vars['zm'] to powinnismy zobaczyc na ekranie true
  33.         return $tmp[2];
  34.     }
  35.     
  36.     public function display ()
  37.     {
  38.         return $this->vars['zm'];
  39.     }
  40. }
  41.  
  42. $pte = new pte();
  43. var_dump($pte->parse() == $pte->display());
  44. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.